8、网络

web方向:少用
android:常用  
 

一、网络通讯三要素:

     1、IP:32位的二进制数据,切成4分,每份8位(192.168.1.1),0~255
     2、端口:标识该消息给哪个应用程序处理的标识符,0~65535,
     3、协议
 
IP地址
  IP地址=网络号+主机号(192.168.1 +1)
  IP地址分类:
       1、A类地址 = 一个网络号+三个主机号 2^24 政府单位
       2、B类地址 = 两个网络号+两个主机号 2^16 事业单位
       3、C类地址 = 三个网络号+一个主机号 2^8 私人
 

1、IP类 InetAddress

常用方法:
(1)返回主机的IP地址对象,静态方法,没有构造方法
     getLocalHost();
(2)返回IP地址的字符串表示形式
     getHostAddress();
(3)返回主机名
     getHostName();
(4)根据主机名或者IP地址的字符串形式确定IP地址对象
     getByName();
(5)返回IP地址的数组形式
     getAllByName();

2、端口

     范围:0~65535
     0~1023:系统紧密绑定的服务
     1024~65535:可以使用

 3、协议:

(1)UDP:飞秋,游戏
(2)TCP                
 
在Java中网络通信也称为Socket(套接字/插座),要求都安装了Socket,不同的协议就有不同的Socket
 

二、UDP通讯协议

1、特点

(1)将数据源及其目的封装为数据包,面向无连接
(2)数据包限制在64K
(3)不可靠
(4)速度快
(5)UDP不分服务端与客户端,只分发送端与接收端
 
UDP协议下的Socket:
    (1)DatagramSocket:UDP插座服务,发送和接收数据包的套接字
    (2)DatagramPacket:数据包类     
     DatagramPacket(buf, length, address, port);  // buf发送的内容;length发送数据内容大小;address发送目的IP地址对象;port端口号
 

2、发送端步骤

(1)建立UDP服务
(2)准备数据,把数据封装到数据包中,发送端要IP地址和端口号
(3)调用UDP发送数据
(4)关闭资源
 

3、接收端步骤

(1)建立UDP服务,监听端口
(2)准备空的数据包
(3)调用UDP服务接收数据
(4)关闭资源
 
每个程序都有自己处理的特定数据格式,接收到的数据不符合指定格式,那么就被丢弃
飞秋格式
版本号:时间:发送人:IP:发送标识符(32):真正内容
 
在UDP协议中有个IP地址为广播地址,主机号为255的地址
给广播IP地址发送消息时,同一网络段的主机都可以接收到消息
 1 // UDP发送端
 2 public static void sendUDPMsg() throws IOException {
 3     // 建立UDP服务
 4     DatagramSocket datagramSendSocket = new DatagramSocket();
 5     // 把数据封装到数据包中
 6     String data = "UDP测试数据";
 7     // 建立数据包
 8     DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getLocalHost(), 9090);
 9     // 调用UDP的服务发送数据包
10     datagramSendSocket.send(datagramPacket);
11     // 关闭资源
12     datagramSendSocket.close();
13 }
 1 public static void reveiveUDPMsg() throws IOException{
 2     // 建立UDP服务,监听端口
 3     DatagramSocket datagramReceiveSocket = new DatagramSocket(9090);
 4     // 建立新的数据包用于存放数据
 5     byte[] buf = new byte[1024];
 6     DatagramPacket datagramReceivePacket = new DatagramPacket(buf, buf.length);
 7     // 调用UDP服务接收数据存放在数据包的buf中
 8     datagramReceiveSocket.receive(datagramReceivePacket);
 9     System.out.println("接收到的数据:"+new String(buf, 0, datagramReceivePacket.getLength()));
10     // 关闭资源
11     datagramReceiveSocket.close();
12 }
 
 1 // 群聊接收端
 2 public class WeChatSender extends Thread{
 3 
 4     @Override
 5     public void run() {
 6         // 不能直接抛出异常,Thread
 7         try {
 8             // 建立UDP服务
 9             DatagramSocket datagramSendSocket = new DatagramSocket();
10             // 准备数据,封装到数据包中,用BufferedReader封装可以逐行读取
11             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
12             // 发送数据
13             String line = null;
14             DatagramPacket datagramSendPacket = null;
15             while((line = bufferedReader.readLine())!=null) {
16                 // 把数据封装到数据包中然后发送
17                 datagramSendPacket = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("192.168.1.255"), 9090);
18                 // 发送数据
19                 datagramSendSocket.send(datagramSendPacket);
20             }
21             // 关闭资源
22             datagramSendSocket.close();
23         } catch (IOException e) {
24             // TODO Auto-generated catch block
25             e.printStackTrace();
26         }
27     }
28 }
 1 // 群聊接收端
 2 public class WeChatReveiver extends Thread{
 3     
 4     @Override
 5     public void run() {
 6         try {
 7             // 建立UDP服务,监听端口
 8             DatagramSocket datagramReveiveSocket = new DatagramSocket(9090);
 9             // 准备空的数据包存储数据
10             byte[] buf = new byte[1024];
11             DatagramPacket datagramReveivePacket = new DatagramPacket(buf, buf.length);
12             // 调用UDP接收数据
13             boolean flag = true;
14             while(flag) {
15                 datagramReveiveSocket.receive(datagramReveivePacket);
16                 System.out.println(datagramReveivePacket.getAddress().getHostAddress()+":"+new String(buf, 0, datagramReveivePacket.getLength()));
17             }
18             // 关闭资源
19             datagramReveiveSocket.close();  // 要是判断条件直接为true会永远执行不到
20         } catch (IOException e) {
21             // TODO Auto-generated catch block
22             e.printStackTrace();
23         }
24     }
25 }

 三、TCP通讯协议

1、特点

     1、基于IO流进行数据传输的,面向连接的
     2、数据传输大小无限制
     3、三次握手(A->B(在?),B->A(在),A->B(好的))保证数据完整性,可靠的协议
     4、速度慢
     5、区分客户端和服务端
 

2、TCP协议下的socket

     Socket:客户端,客户端一启动马上与服务端进行通讯
     SeverSocket:服务端
 

3、TCP客户端步骤:

(1)建立TCP客户端服务
(2)获取socket对应的流对象
(3)写或读数据
(4)关闭资源
 

4、TCP服务端步骤:

(1)建立TCP服务端的服务
(2)接收客户端的连接,产生一个socket
(3)获取对应的流对象,读或写出数据
(4)关闭资源
 
用BufferedReader就是想调用readLine()方法一行一行的读取字符,持续输入的时候需要在拼接的字符串后面加上 作为是否为null的判断条件
 
 
 
 
 
 
 
 
有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
原文地址:https://www.cnblogs.com/1989guojie/p/6115930.html