💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # UDP UDP是一种面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。 UDP通信的过程就像是货运公司在两个码头间发送货物一样。在码头发送和接收货物时都需要使用集装箱来装载货物,UDP通信也是一样,发送和接收的数据也需要使用“集装箱”进行打包, 为此JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。 ## DatagramPacket **接收方** ~~~ 构造DatagramPacket,用来接收长度为length的数据包 DatagramPacket(byte[] buf, int length) ~~~ **发送方** ~~~ 构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号 DatagramPacket(byte[] buf, int length, InetAddress address, int port) ~~~ 使用该构造方法在创建DatagramPacket对象时,不仅指定了封装数据的字节数组和数据的大小,还指定了数据包的目标IP地址(addr)和端口号(port)。该对象通常用于发送端,因为在发送数据时必须指定接收端的IP地址和端口号,就好像发送货物的集装箱上面必须标明接收人的地址一样。 ### 常用方法 ~~~ 返回某台机器的IP地址,此数据报将要发往该机器或是从该机器接收到 InetAddress getAdress() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到 int getPort() 返回数据缓冲区 byte[] getData() 返回将要发送或接收到的数据长度 int getLength() ~~~ ## DatagramSocket DatagramPacket数据包的作用就如同是“集装箱”,可以将发送端或者接收端的数据封装起来。 然而运输货物只有“集装箱”是不够的,还需要有码头。 在程序中需要实现通信只有DatagramPacket数据包也同样不行,为此JDK中提供的一个DatagramSocket类。 DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包,发送数据的过程如下图所示。 ![](https://box.kancloud.cn/246b17f965be687cb4de4a82865a55bf_803x339.png) 在创建发送端和接收端的DatagramSocket对象时,使用的构造方法也有所不同 ### 常用方法 构造方法 ![](https://box.kancloud.cn/3bef2602034c788e82afbcfb9e96c72c_919x323.png) 方法 ~~~ 从此套接字接收数据报包 void receive(DatagramPacket p) 从此套接字发送数据报包 void send(DatagramPacket p) ~~~ ## UDP网络程序(聊天室) **接收端** ~~~ //创建数据包传输对象,并绑定端口6000 DatagramSocket datagramSocket = new DatagramSocket(6000); //创建字节数组 byte[] data = new byte[1024]; while (true) { //创建数据包对象,传递字节数组 DatagramPacket datagramPacket = new DatagramPacket(data, data.length); //调用datagramSocket对象方法receive传递数据包 datagramSocket.receive(datagramPacket); //获取发送端的ip地址对象和端口 String ip = datagramPacket.getAddress().getHostAddress(); int port = datagramPacket.getPort(); int length = datagramPacket.getLength(); System.out.println(new String(data,0,length)+"..."+ip+":"+port); } //datagramSocket.close(); ~~~ **发送端** ~~~ Scanner sc = new Scanner(System.in); //创建DatagramSocket对象,数据包的发送和接收对象 DatagramSocket datagramSocket = new DatagramSocket(); //创建InetAddress对象,封装自己的ip地址 InetAddress inetAddress = InetAddress.getByName("127.0.0.1"); while (true) { String message = sc.nextLine(); byte[] date = message.getBytes(); DatagramPacket datagramPacket = new DatagramPacket(date, date.length, inetAddress, 6000); //发送数据包 datagramSocket.send(datagramPacket); } //关闭资源 //datagramSocket.close(); ~~~