1、DatagramPacket
(1)JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据;
(2)在创建发送端和接收端的DatagramPacket对象时,使用的构造方法有所不同,接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端IP地址和端口号;
2、DatagramSocket
(1)DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包;
3、UDP网络程序
(1)要实现UDP通信需要创建一个发送端程序和一个接收端程序,很明显,在通信时只有接收端程序先运行,才能避免因发送端发送的数据无法接收,而造成数据丢失。因此,首先需要来完成接收端程序的编写;
(2)UDP完成数据的接收
1 import java.io.IOException; 2 import java.net.DatagramPacket; 3 import java.net.DatagramSocket; 4 import java.net.InetAddress; 5 6 /* 7 * UDP接收端 8 * 9 * 1,创建DatagramSocket对象 10 * 2,创建DatagramPacket对象 11 * 3,接收数据存储到DatagramPacket对象中 12 * 4,获取DatagramPacket对象的内容 13 * 5,释放流资源 14 */ 15 public class UDPReceive { 16 public static void main(String[] args) throws IOException { 17 // 1,创建DatagramSocket对象,并指定端口号 18 DatagramSocket receiveSocket = new DatagramSocket(12306); 19 // 2,创建DatagramPacket对象, 创建一个空的仓库 20 byte[] buffer = new byte[1024]; 21 DatagramPacket dp = new DatagramPacket(buffer, 1024); 22 // 3,接收数据存储到DatagramPacket对象中 23 receiveSocket.receive(dp); 24 // 4,获取DatagramPacket对象的内容 25 // 谁发来的数据 getAddress() 26 InetAddress ipAddress = dp.getAddress(); 27 String ip = ipAddress.getHostAddress();// 获取到了IP地址 28 // 发来了什么数据 getData() 29 byte[] data = dp.getData(); 30 // 发来了多少数据 getLenth() 31 int length = dp.getLength(); 32 // 显示收到的数据 33 String dataStr = new String(data, 0, length); 34 System.out.println("IP地址:" + ip + "数据是" + dataStr); 35 // 5,释放流资源 36 receiveSocket.close(); 37 } 38 }
(3)UDP完成数据的发送
1 import java.io.IOException; 2 import java.net.DatagramPacket; 3 import java.net.DatagramSocket; 4 import java.net.InetAddress; 5 6 /* 7 * 发送端 8 * 1,创建DatagramSocket对象 9 * 2,创建DatagramPacket对象,并封装数据 10 * 3,发送数据 11 * 4,释放流资源 12 */ 13 public class UDPSend { 14 public static void main(String[] args) throws IOException { 15 // 1,创建DatagramSocket对象 16 DatagramSocket sendSocket = new DatagramSocket(); 17 // 2,创建DatagramPacket对象,并封装数据 18 // public DatagramPacket(byte[] buf, int length, InetAddress address, 19 // int port) 20 // 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 21 byte[] buffer = "hello,UDP".getBytes(); 22 DatagramPacket dp = new DatagramPacket(buffer, buffer.length, 23 InetAddress.getByName("192.168.0.4"), 12306); 24 // 3,发送数据 25 // public void send(DatagramPacket p) 从此套接字发送数据报包 26 sendSocket.send(dp); 27 // 4,释放流资源 28 sendSocket.close(); 29 } 30 }
运行结果: