UDP通信
1、UDP概述
UDP(User Datagram Protocol):用户数据报协议,是一种面向无连接的协议,在通信时发送端和接收端不用建立连接。
2、DatagramPacket
DatagramPacket用于封装数据,在接收端和发送端的DatagramPacket方法有所不同,接收端的构造方法只需要接受一个字节数组来存放接收到的数据,而发送端的构造方法不但要接受发送数据要存放的字节数组,还需要指定发送端IP地址和端口号。
接收端构造方法:
DatagramPacket(byte[] buf, int length):构造DatagramPacket,用来接受长度为length的数据包。
发送端构造方法:
DatagramPacket(byte[] buf, int length, InteAddress address, int port):构造数据包,用来将长度为length的包发送到指定主机上的指定端口号。
常用方法:
- InetAddress getAddress():返回某台机器的IP地址,此数据报将要发往该机器或者是从该机器接收到的。
- int getPort():返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接受到的。
- getData():返回数据缓冲区。
- int getLength():返回将要发送或接收到的数据的长度。
3、DatagramSocket
DatagramSocket类的常用构造方法:
- DatagramSocket():构造数据报套接字并将其绑定到本地主机上的任何可用的端口。
- DatagramSocket():构造数据报套接字并将其绑定到本地主机上的指定端口。
常用方法:
- void receive(DatagramPacket p):从此套接字接收数据报包。
- void send(DatagramPacket p):从此套接字发送数据报包。
4、UDP网络程序
UDP接收端
1 package udp; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 8 /** 9 * <p>Description:UDP接收端 </p> 10 * @author Administrator 11 * @date 2018年11月6日下午3:17:01 12 */ 13 public class UDPReceive { 14 15 public static void main(String[] args) throws IOException { 16 // 创建DatagramSocket对象,并指定端口号 17 DatagramSocket ds = new DatagramSocket(6000); 18 // 创建一个空仓库 19 byte[] buffer = new byte[1024]; 20 // 创建DatagramPacket对象 21 DatagramPacket dp = new DatagramPacket(buffer, 1024); 22 // 接受数据 23 ds.receive(dp); 24 // 获取DatagramPacket对象内容 25 InetAddress ipAddress = dp.getAddress(); 26 String ip = ipAddress.getHostAddress(); 27 // 解析数据 28 byte[] data = dp.getData(); 29 int length = dp.getLength(); 30 // 显示接受到的数据 31 String dataStr = new String(data, 0, length); 32 System.out.println("ip地址:" + ip + "数据是:" + dataStr); 33 // 释放资源 34 ds.close(); 35 } 36 37 }
UDP发送端
1 package udp; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 8 /** 9 * <p>Description:UDP发送端 </p> 10 * @author Administrator 11 * @date 2018年11月6日下午3:07:53 12 */ 13 public class UDPSend { 14 15 public static void main(String[] args) throws IOException { 16 // 创建DatagramSocket对象 17 DatagramSocket ds = new DatagramSocket(); 18 // 构造数据报包,用来将长度为length的包发送到指定主机的指定端口号上 19 byte[] buffer = "hello,UDP".getBytes(); 20 // 创建InetAddress对象,封装自己的IP地址 21 InetAddress inet = InetAddress.getByName("127.0.0.1"); 22 // 创建DatagramPacket对象 23 DatagramPacket dp = new DatagramPacket(buffer, buffer.length, inet, 6000); 24 // 发送数据 25 ds.send(dp); 26 // 释放资源 27 ds.close(); 28 } 29 30 }