Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

来源:互联网 发布:js判断ios android 编辑:程序博客网 时间:2024/05/20 05:27

UDP协议:无需建立虚拟链路,协议是不可靠的。
A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达;但有些情况下,数据报可能会丢失 --丢失了也不管。

先了解2个类:
DatagramSocket:相当于“码头”,此类表示用来发送和接收数据报的套接字。
DatagramPacket:代表数据报。

举例说明1:
服务器端

 

Java代码  收藏代码
  1. public class SimpleUDPServer {  
  2.     final static int SERVER_PORT = 30000;  
  3.     final static int PACKET_SIZE = 4092;  
  4.   
  5.     public static void main(String[] args) {  
  6.         DatagramSocket datagramSocket = null;  
  7.         DatagramPacket datagramPacket = null;  
  8.         try {  
  9.             while (true) {  
  10.                 // 创建datagramSocket,准备用于发送和接收数据报  
  11.                 datagramSocket = new DatagramSocket(SERVER_PORT);  
  12.                 datagramPacket = new DatagramPacket(new byte[PACKET_SIZE],  
  13.                         PACKET_SIZE);  
  14.                 // 使用一个空的packet去装datagramSocket接收到的数据  
  15.                 datagramSocket.receive(datagramPacket);  
  16.                 // 将datagramPacket中接收到的字节数组转换为字符串,然后输出  
  17.                 System.out.println(new String(datagramPacket.getData(), 0,  
  18.                         datagramPacket.getLength()));  
  19.             }  
  20.         } catch (IOException e) {  
  21.             e.printStackTrace();  
  22.         }  
  23.     }  
  24. }  

客户端:

Java代码  收藏代码
  1. public class SimpleUDPClient {  
  2.     final static int SERVER_PORT = 30000;  
  3.   
  4.     public static void main(String[] args) {  
  5.         DatagramSocket datagramSocket = null;  
  6.         DatagramPacket datagramPacket = null;  
  7.         try {  
  8.             // 创建datagramSocket,准备用于发送和接收数据报  
  9.             // datagramSocket使用动态端口(以便选择一个空闲的端口)  
  10.             datagramSocket = new DatagramSocket();  
  11.             String content = "Java学习系列(十八)Java面向对象之基于UDP协议的网络通信";  
  12.   
  13.             // 创建一个有数据、有目的地址的datagramPacket  
  14.             datagramPacket = new DatagramPacket(content.getBytes(), content  
  15.                     .getBytes().length, InetAddress.getByAddress(new byte[] {  
  16.                     (byte192, (byte16808 }), SERVER_PORT);  
  17.             // 发送数据报  
  18.             datagramSocket.send(datagramPacket);  
  19.         } catch (IOException e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  
  23. }  

MulticastSocket将数据报发送到“广播地址”,数据报会被自动“广播”到所有加入该IP地址的客户端。
TTL是控制数据可以跨过多少个网段。
--当ttl为0时,说明该数据报只能停留在本机;
--当ttl为1时,说明数据报只能停留在当前局域网。
--当ttl为32时,说明数据报只能停留在本站点的网络。
--当ttl为64时,说明数据报只能停留在本地区。
--当ttl为128时,说明数据报只能停留在本大洲(如亚洲)。
--当ttl为255时,说明数据报达到全球。

0 0
原创粉丝点击