黑马程序员——Java基础--网络编程

来源:互联网 发布:php清空数组 编辑:程序博客网 时间:2024/05/12 11:43

-----------android培训java培训、java学习型技术博客、期待与您交流!------------

网络编程
一、概述
        网络编程简单的说就是实现了多个计算机互联的系统,我们可以通过网络进行交换数据,而实现这一原理我们要编写网络应用程序,编写之前我们得了解网络程序所要使用的网络协议,TCP/IP是我们首先考虑到的协议,当然计算机网络有两种参考模型:

当然,要实现这一原理,我们还得知道网络通信的三要素:
1、IP地址:InetAddress,网络中设备的标识,不易记忆,可用主机名表示,两者存在映射关系,本机回环地址:127.0.0.1,主机名为:localhost。
2、端口号:
用于标识进程的逻辑地址,不用进程的标识。有效端口:0 ~65535,系统使用或保留的端口是:0~ 1024
3、传输协议:
即通信规则,包含TCPUDP协议

TCP 是面向连接的,必须连接成功才能传输数据,应用于下载等程序上,

其特点:

         a、面向连接,在建立连接后,形成传输数据的通道;

         b、在连接中进行大数据量的传输;

         c、通过三次握手完成连接,是可靠的协议;

         d、必须建立连接,效率稍慢。

UDP是面向无连接,明确了对方的端口,无论在不在网上,只管传输,不在就会丢失数据。只求速度,应用于网络视频会议和聊天等应用程序中。

其特点:

         a、面向无连接,即将数据及源和目的封装成数据包中,不建立链接的发送;

         b、每个数据包的大小限制在64K之内;

         c、因无连接,是不可靠的协议;

         d、不建立连接,速度快。

二、Socket编程

        1、它被称之为插座,相当于港口一样,是网络服务提供的一种机制。

        2、通信两端都要有Socket,才能建立服务。

        3、网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。

三、TCP小程序
使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。
服务器
package com.itheima;/* * 使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。分析:先打开服务器端,在打开客户端进行输入,在反转发回给客户端*/import java.net.*;import java.io.*;// 服务器class Test10_1{public static void main(String[] args) {try{ServerSocket ss = new ServerSocket(6666);//创建对象,给定端口号Socket socket = ss.accept();//接收客户端的连接System.out.println("连接成功..等待Client输入..");InputStream in = socket.getInputStream();//获取输入流OutputStream out = socket.getOutputStream();//获取输出流DataInputStream dis = new DataInputStream(in);DataOutputStream dos = new DataOutputStream(out);String s = null;if ((s = dis.readUTF()) != null){System.out.println("Client : " + s);//创建StringBuilder对象StringBuilder sb = new StringBuilder(s);//将接收客户端的字符串为初始化内容StringBuilder s2 = sb.reverse();//字符串反转String s3 = s2.toString();dos.writeUTF(s3);// 写入方法}dis.close();dos.close();ss.close();} catch(IOException e) {//捕获异常e.printStackTrace();}}}
客户端
package com.itheima;/* * 使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。分析:先打开服务器端,在打开客户端进行输入,在反转发回给客户端*/import java.net.*;import java.util.*;import java.io.*;// 客户端类class Test10_2{public static void main(String[] args) {Scanner sc = new Scanner(System.in);try{Socket socket = new Socket("127.0.0.1",6666);//创建Socket对象,连接到指定IP地址和端口InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();DataInputStream dis = new DataInputStream(in);DataOutputStream dos = new DataOutputStream(out);String s = null;System.out.println("请输入字符串..");String s2 = sc.next();//接收键盘录入dos.writeUTF(s2);dos.flush();if ((s = dis.readUTF()) != null){System.out.println("Server : " + s);}dos.close();dis.close();socket.close();} catch(IOException e) {e.printStackTrace();}}}
四、UDP小程序
package cn.itheima.xieyi;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;/* 编写一个聊天程序。 有收数据的部分,和发数据的部分。 这两部分需要同时执行。 那就需要用到多线程技术。 一个线程控制收,一个线程控制发。 因为收和发动作是不一致的所以要定义两个run方法而且这个两个方法要封装到不同的类中。*///UDP发送线程class UdpSend implements Runnable{//定义Socket服务引用private DatagramSocket ds;UdpSend(DatagramSocket ds){this.ds = ds;}//复写run方法public void run(){try{//确定数据,从键盘录入,并把键盘录入的数据封装成数据包DatagramPacket dp=null;BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String line=null;while((line=br.readLine())!=null){byte[] buf=line.getBytes();dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10000);//通过Socket服务,将已有的数据包发送出去ds.send(dp);if ("886".equals(line)){break;}}//释放资源ds.close();}catch (Exception e) {throw new RuntimeException("发送数据失败");}}}//Udp接收线程class UdpReceive implements Runnable{//定义Socket服务引用private DatagramSocket ds;UdpReceive(DatagramSocket ds){this.ds = ds;}//复写run方法public void run() {try{//一直处于接收状态while (true){//定义数据包,用于存储数据byte[] buf=new byte[1024];DatagramPacket dp=new DatagramPacket(buf,buf.length);//通过Socket服务,将数据接收并存储进数据包中ds.receive(dp);//通过数据包的方法获取其中的数据String ip=dp.getAddress().getHostAddress();String data=new String(dp.getData(),0,dp.getLength());int port=dp.getPort();System.out.println("IP:"+ip+"=="+data);}//释放资源}catch(Exception e){throw new RuntimeException("接收端接收数据失败");}}}public class Test_3 {public static void main(String[] args) throws SocketException {new Thread(new UdpSend(new DatagramSocket())).start();new Thread(new UdpReceive(new DatagramSocket(10000))).start();}}

-----------android培训java培训、java学习型技术博客、期待与您交流!------------



0 0