UDP协议:无需建立虚拟链路,协议是不可靠的。
A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达;但有些情况下,数据报可能会丢失 --丢失了也不管。
先了解2个类:
DatagramSocket:相当于“码头”,此类表示用来发送和接收数据报的套接字。
DatagramPacket:代表数据报。
举例说明1:
服务器端
- publicclassSimpleUDPServer{
- finalstaticintSERVER_PORT=30000;
- finalstaticintPACKET_SIZE=4092;
- publicstaticvoidmain(String[]args){
- DatagramSocketdatagramSocket=null;
- DatagramPacketdatagramPacket=null;
- try{
- while(true){
- //创建datagramSocket,准备用于发送和接收数据报
- datagramSocket=newDatagramSocket(SERVER_PORT);
- datagramPacket=newDatagramPacket(newbyte[PACKET_SIZE],
- PACKET_SIZE);
- //使用一个空的packet去装datagramSocket接收到的数据
- datagramSocket.receive(datagramPacket);
- //将datagramPacket中接收到的字节数组转换为字符串,然后输出
- System.out.println(newString(datagramPacket.getData(),0,
- datagramPacket.getLength()));
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
客户端:
- publicclassSimpleUDPClient{
- finalstaticintSERVER_PORT=30000;
- publicstaticvoidmain(String[]args){
- DatagramSocketdatagramSocket=null;
- DatagramPacketdatagramPacket=null;
- try{
- //创建datagramSocket,准备用于发送和接收数据报
- //datagramSocket使用动态端口(以便选择一个空闲的端口)
- datagramSocket=newDatagramSocket();
- Stringcontent="Java学习系列(十八)Java面向对象之基于UDP协议的网络通信";
- //创建一个有数据、有目的地址的datagramPacket
- datagramPacket=newDatagramPacket(content.getBytes(),content
- .getBytes().length,InetAddress.getByAddress(newbyte[]{
- (byte)192,(byte)168,0,8}),SERVER_PORT);
- //发送数据报
- datagramSocket.send(datagramPacket);
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
MulticastSocket将数据报发送到“广播地址”,数据报会被自动“广播”到所有加入该IP地址的客户端。
TTL是控制数据可以跨过多少个网段。
--当ttl为0时,说明该数据报只能停留在本机;
--当ttl为1时,说明数据报只能停留在当前局域网。
--当ttl为32时,说明数据报只能停留在本站点的网络。
--当ttl为64时,说明数据报只能停留在本地区。
--当ttl为128时,说明数据报只能停留在本大洲(如亚洲)。
--当ttl为255时,说明数据报达到全球。