一、UDP协议简介(User Datagram Protocol,用户数据报协议)
UDP是传输层的协议,该协议主要为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测。
二、UDP的主要特点:
1. UDP是无连接的
即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
2. UDP使用尽最大努力交付
即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里边有许多参数)。
3. UDP是面向报文的
发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
4. UDP没有拥塞控制
因此网络出现的拥塞不会使源主机的发送速率降低。
5. UDP支持一对一、一对多、多对一和多对多的交互通信
6. UDP的首部开销小
只有8个字节,比TCP的20个字节的首部要短。
三、DatagramSocket类
DatagramSocket 类用于表示发送和接收数据报包的套接字。数据报包套接字是包投递服务的发送或接收点。每个在数据报包套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
1. 构造方法
(1)DatagramSocket()
表示创建一个默认的套接字,并绑定到本地地址和一个随机的端口号
(2)DatagramSocket(int port)
表示创建一个默认的套接字,并绑定到本地地址和特定的端口号
(3)DatagramSocket(int port, InetAddress iad)
表示创建一个套接字,绑定到特定的端口号及指定地址
(4)DatagramSocket(SocketAddress sad)
表示创建一个套接字,绑定到特定的套接字地址
2. 基本方法
(1)close()
关闭套接字
(2)recevie(DatagramPacket dp)
接受数据报
(3)send(DatagramPacket dp)
发送数据报
四、DatagramPacket类
java.net 包中的 DatagramPacket 类用来表示数据报包,数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
1. 接受类型
(1)DatagramPacket(byte[] buf, int length)
用来接受长度为length的buf数据(即数据存于字节数组buf中)
2. 发送类型
(1)DatagramPacket(byte[] buf, int length, InetAddress address, int port)
将length长的buf数据发送到指定的地址的端口号处
(2)DatagramPacket(byte[] buf, int length, SocketAddress address)
将length长的buf数据发送到指定的套接字地址处
五、代码实例
先运行接收方,再运行发送方。
SendMessage信息发送端:
java
public class SendMessage {
public static void main(String[] args) {
try {
// 1.建立套接字
DatagramSocket ds = new DatagramSocket();
// 2.创建信息,并且打包
String info = "原神,启动!";
// 信息装包 信息内容 信息长度 ip/域名 10086
DatagramPacket dp = new DatagramPacket(
info.getBytes(),
info.getBytes().length,
InetAddress.getByName("127.0.0.1"),
10086
);
ds.send(dp); // 使用datagramSocket对象将DatagramPacket对象发送出去
ds.close(); // 关闭
} catch (SocketException e) {
throw new RuntimeException(e);
} catch (UnknownHostException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Recv信息接收端:
java
public class Recv {
public static void main(String[] args) {
try {
// 1.套接字
DatagramSocket ds = new DatagramSocket(10086);
// 2. 创包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
// 3.将接受的信息写到包里面
ds.receive(dp);
System.out.println(dp);
for (byte b : bytes) {
System.out.println(b);
}
System.out.println(dp.getData());
// 4.关闭
ds.close();
} catch (SocketException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}