DatagramSocket
和 DatagramPacket
(数据包/数据报)实现了基于 UDP协议网络程序。DatagramSocket
发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。DatagramPacket
对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。说明:
DatagramSocket
对象完成的DatagramPacket
对象/装包,发送DatagramPacket
对象,需要进行拆包,取出数据DatagramSocket
可以指定在那个端口接收数据DatagramSocket
与DatagramPacket
DatagramPacket
对象DatagramSocket
的发送、接收方法DatagramSocket
receive
)public class UDPReceiverA { public static void main(String[] args) throws IOException { //1. 创建一个 DatagramSocket对象,在9999端口监听 DatagramSocket socket = new DatagramSocket(9999); //2. 构建一个 DatagramPacket对象,准备接受数据 // 数据包最大为64KB byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); //3. 调用接收方法,将 通过网络传输的packet对象 填充到 我们的空的packet // 当有数据包发送到本机的9999端口,就会接收数据 // 如果没有收到数据,就会堵塞 System.out.println("---------------接收端A等待接收数据---------------"); socket.receive(packet); //4. 可以对packet进行拆包,取出数据,并显示 int length = packet.getLength(); byte[] data = packet.getData(); String s = new String(data, 0, length); System.out.println(s); //发送反馈 byte[] bytes = "好的,明天见啦~".getBytes(); DatagramPacket packet1 = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.0.109"), 9998); socket.send(packet1); //关闭socket socket.close(); System.out.println("---------------接收端A退出---------------"); } }
public class UDPSenderB { public static void main(String[] args) throws IOException { //1. 创建一个 DatagramSocket对象,准备在9999端口接受数据 // 因为发送端也可以接收数据,所以也需要一个端口 DatagramSocket socket = new DatagramSocket(9998); //2. 构建一个 DatagramPacket对象,放入要发送的数据 byte[] bytes = "Hello, 今晚吃火锅吗?".getBytes(); DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.0.109"), 9999); //3. 发送数据包 socket.send(packet); //4. 接受并拆解数据包 System.out.println("---------------接受来自接受端A的消息---------------"); byte[] buf = new byte[1024]; DatagramPacket packet1 = new DatagramPacket(buf, buf.length); socket.receive(packet1); int length = packet1.getLength(); byte[] data = packet1.getData(); String s = new String(data, 0, length); System.out.println(s); //关闭socket socket.close(); System.out.println("---------------发送端B退出---------------"); } }