1 UDP网络通信编程原理
1.1 UDP网络通信编程介绍
类 DatagramSocket 何 DatagramPacket(数据包/数据报) 实现了基于 UDP协议网络程序;
UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证 UDP数据报一定能够安全送达目的地,也不确定什么时候可以抵达;
DatagramPacket 对象封装了 UDP数据报,在数据报中包含了发送端IP地址和端口号,以及接收端的IP地址和端口号;
UDP协议中每个数据报都给出了完整的地址信息,因此无法建立发送方与接收方的连接。
没有明确的服务端和客户端,演变成数据的发送端和接收端;
接收数据和发送数据都是通过 DatagramSocket 对象完成。
1.2 UDP网络通信编程的基本流程
核心的两个类/对象,DatagramSocket与DatagramPacket;
建立发送端和接收端;
建立数据包;
调用DatagramSocket的发送和接收方法;
关闭DatagramSocket。
2 UDP网络通信编程案例
1.编写一个接收端A,一个发送端B;
2.接收端在 9999端口等待接收数据(receive);
3.发送端向接收端发送数据:“你好!接收端”;
4.接收端接收到发送端的数据后,回复:“你好!发送端”,再退出;
5.发送端接收回复的数据,退出。
UDPReceiverA
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * @author 兴趣使然黄小黄 * @version 1.0 * 接收端A */ public class UDPReceiverA { public static void main(String[] args) throws IOException { //1.创建一个DatagramSocket对象,准备在9999接收数据 DatagramSocket socket = new DatagramSocket(9999); //2.构建一个DatagramPacket对象,准备接收数据 byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); //3.调用接收方法,将通过网络传输的 DatagramPacket对象 填充到 packet对象 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); //回复信息给B端 data = "你好!发送端".getBytes(); packet = new DatagramPacket(data, 0, data.length, InetAddress.getLocalHost(), 9998); socket.send(packet); //5.关闭资源 socket.close(); } }
UDPSenderB
import java.io.IOException; import java.net.*; /** * @author 兴趣使然黄小黄 * @version 1.0 * 发送端B */ public class UDPSenderB { public static void main(String[] args) throws IOException { //1.创建 DatagramSocket 对象,准备在9998发送和接收数据 DatagramSocket socket = new DatagramSocket(9998); //2.将需要发送的数据,封装到 DatagramPacket 中 byte[] data = "你好!接收端".getBytes(); DatagramPacket datagramPacket = new DatagramPacket(data, 0, data.length, InetAddress.getLocalHost(), 9999); socket.send(datagramPacket); //接收A消息 socket.receive(datagramPacket); int length = datagramPacket.getLength();//实际数据字节长度 data = datagramPacket.getData();//实际接收的数据 String s = new String(data, 0, length); System.out.println(s); //关闭资源 socket.close(); } }