简介
单播有TCP和UDP两种实现,组播(多播)和广播只有UDP一种实现。单播和广播基本同样,只是广播的数据包IP为广播IP。
单播
DatagramSocket和DatagramPacket
服务端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServer {
public static void main(String[] args) throws Exception {
System.out.println("启动UDP单播服务端");
// 构造DatagramSocket实例,指定本地端口6666
try (DatagramSocket datagramSocket = new DatagramSocket(6666)) {
//设置超时时间为10秒
datagramSocket.setSoTimeout(10000);
while (true) {
// 应用层交给UDP多长的报文,UDP就照样发送,一次发送一个报文。报文最大长度有限制,不然会致使IP层分片,最大值最好小于548字节
// 构造DatagramPacket实例,用来接收最大长度为512字节的数据包
byte[] data = new byte[512];
DatagramPacket receivePacket = new DatagramPacket(data, 512);
// 接收报文,此方法在接收到数据报前一直阻塞
datagramSocket.receive(receivePacket);
System.out.println("客户端地址:" + receivePacket.getAddress().getHostAddress());
System.out.println("客户端端口:" + receivePacket.getPort());
System.out.println("接收到的数据长度:" + receivePacket.getLength());
System.out.println("接收到的数据:" + new String(receivePacket.getData(), 0, receivePacket.getLength(), "UTF-8"));
}
}
}
}
客户端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UDPClient {
public static void main(String[] args) throws Exception {
{
// 构造DatagramSocket实例,指定本地端口8888
try (DatagramSocket datagramSocket = new DatagramSocket(8888)) {
for (int i = 0; i < 5; i++) {
String data = "当前循环:" + i;
// 构造数据报包,用来将data发送到指定主机上的指定端口号。
DatagramPacket sendPacket = new DatagramPacket(data.getBytes("UTF-8"), data.getBytes("UTF-8").length, new InetSocketAddress("10.206.16.67", 6666));
//发送报文
datagramSocket.send(sendPacket);
}
}
}
}
}
服务端打印:
启动UDP单播服务端
客户端地址:10.206.16.67
客户端端口:8888
接收到的数据长度:16
接收到的数据:当前循环:0
客户端地址:10.206.16.67
客户端端口:8888
接收到的数据长度:16
接收到的数据:当前循环:1
客户端地址:10.206.16.67
客户端端口:8888
接收到的数据长度:16
接收到的数据:当前循环:2
客户端地址:10.206.16.67
客户端端口:8888
接收到的数据长度:16
接收到的数据:当前循环:3
客户端地址:10.206.16.67
客户端端口:8888
接收到的数据长度:16
接收到的数据:当前循环:4
Exception in thread "main" java.net.SocketTimeoutException: Receive timed out
at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)
at java.net.DualStackPlainDatagramSocketImpl.receive0(DualStackPlainDatagramSocketImpl.java:120)
at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:144)
at java.net.