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