Java的UDP通信:DatagramSocket和DatagramPacket
- 1、UDP协议简介
- [2、DatagramSocket 类](#2、DatagramSocket 类)
- [3、DatagramPacket 类](#3、DatagramPacket 类)
- [4、InetAddress类 和 SocketAddress类](#4、InetAddress类 和 SocketAddress类)
- 5、代码示例
1、UDP协议简介
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,传输可靠性没有保证。
2、DatagramSocket 类
DatagramSocket 类用于表示发送和接收数据报包的套接字。数据报包套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。
DatagramSocket
不保证数据的可靠性和顺序,如果需要可靠性,则必须在应用程序中实现。DatagramSocket
适用于需要低延迟的应用,如流媒体、语音交流和视频会议。DatagramSocket
的send
和receive
方法不会对传入和传出的数据包执行任何安全检查,除了匹配数据包和套接字的地址和端口。DatagramSocket
在发送数据时,不知道数据报的目的地,而是由 DatagramPacket 自身决定数据报的目的地。
2.1、构造方法
DatagramSocket()
:创建一个绑定到本地地址和随机端口号的 DatagramSocket 实例。DatagramSocket(int port)
:创建一个绑定到本地默认 IP 地址和指定端口的实例。DatagramSocket(int port, InetAddress laddr)
:创建一个绑定到特定 IP 地址和端口的实例。DatagramSocket(SocketAddress bindaddr)
:创建一个绑定到指定本地套接字地址的实例。
2.2、基本方法
send(DatagramPacket p)
:从套接字发送数据报包。receive(DatagramPacket p)
:从套接字接收数据报包。close()
:关闭套接字。
3、DatagramPacket 类
java.net 包中的 DatagramPacket 类用来表示数据报包的类,数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
3.1、接收类型
DatagramPacket(byte[] buf, int length)
:用来接收长度为 length 的 buf 数据(即数据存于字节数组buf中)。
3.2、发送类型
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
:将长度为 length 的 buf 数据发送到指定的地址和端口。
DatagramPacket(byte[] buf, int length, SocketAddress address)
:将length长的buf数据发送到指定的套接字地址处
4、InetAddress类 和 SocketAddress类
InetAddress
只关心 IP 地址(定位到主机)。
SocketAddress
关心的是 IP 地址 + 端口号(定位到主机上的具体应用程序)。
5、代码示例
1、一个发送方UdpSend ,一个接收方UdpReceive 。
2、先运行接收方,再运行发送方。
5.1、UdpReceive
java
public class UdpReceive {
public static void main(String[] args) {
try (DatagramSocket datagramSocket = new DatagramSocket(8848)) {
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
datagramSocket.receive(datagramPacket); // 接收数据
byte[] arr = datagramPacket.getData(); // 获取数据
int len = datagramPacket.getLength(); // 获取有效长度
System.out.println(new String(arr, 0, len));
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.2、UdpSend
java
public class UdpSend {
public static void main(String[] args) {
try (DatagramSocket datagramSocket = new DatagramSocket()) {
byte[] buf = "你好世界".getBytes();
int length = buf.length;
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 8848;
// 创建DatagramPacket(要发送的数据,数据的长度,Ip地址,端口)
DatagramPacket datagramPacket = new DatagramPacket(buf, length, address, port);
datagramSocket.send(datagramPacket); // 发送
} catch (Exception e) {
e.printStackTrace();
}
}
}