第3课_UDP通信
热度🔥:18 免费课程
授课语音
UDP 通信知
一、UDP 通信介绍
UDP(用户数据报协议)是一种面向无连接的传输层协议,它不像 TCP 协议那样需要建立连接。UDP 适合实时应用场景,数据传输速度快,常用于视频流、音频通话等实时通信应用。因为 UDP 无需连接、无序且不保证数据可靠传输,因此存在丢包、乱序的可能。
UDP 特点:
- 无连接:发送数据前不需要建立连接,直接将数据发给接收方。
- 不可靠:不保证数据到达目的地,也不保证数据按发送顺序到达。
- 适合实时通信:UDP的传输速度较快,适合音视频等实时场景。
- 轻量级:相比 TCP,不需要维护连接状态,资源消耗较少。
二、UDP 代码案例
代码示例一:一发一收(单发送、单接收)
在本示例中,我们将实现一个简单的 UDP 单发单收应用程序。发送方发送一个消息给接收方,接收方接收并打印消息内容。
1. UDP 发送方
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPSender {
public static void main(String[] args) {
try {
// 定义发送内容
String message = "你好,UDP 接收方!";
// 指定接收方 IP 地址和端口
InetAddress receiverAddress = InetAddress.getByName("localhost");
int receiverPort = 8080;
// 创建 UDP 套接字
DatagramSocket socket = new DatagramSocket();
// 创建数据包,包含消息内容
byte[] data = message.getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, receiverAddress, receiverPort);
// 发送数据包
socket.send(packet);
System.out.println("发送消息: " + message);
// 关闭套接字
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. UDP 接收方
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPReceiver {
public static void main(String[] args) {
try {
// 指定接收端口
int port = 8080;
// 创建 UDP 套接字
DatagramSocket socket = new DatagramSocket(port);
// 定义接收数据包的缓冲区
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
// 接收数据包
socket.receive(packet);
// 提取并打印消息内容
String receivedMessage = new String(packet.getData(), 0, packet.getLength());
System.out.println("接收消息: " + receivedMessage);
// 关闭套接字
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
代码示例二:多发多收(多发送、多接收)
在多发多收的场景中,多个客户端同时发送消息给同一个服务端,服务端可以连续接收多条消息。
1. UDP 多发送客户端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class MultiUDPSender {
public static void main(String[] args) {
try {
// 指定接收方 IP 地址和端口
InetAddress receiverAddress = InetAddress.getByName("localhost");
int receiverPort = 8080;
// 创建 UDP 套接字
DatagramSocket socket = new DatagramSocket();
// 模拟多次发送
for (int i = 1; i <= 5; i++) {
String message = "消息 " + i + " 来自 UDP 多发客户端";
byte[] data = message.getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, receiverAddress, receiverPort);
// 发送数据包
socket.send(packet);
System.out.println("发送消息: " + message);
// 模拟延迟
Thread.sleep(500);
}
// 关闭套接字
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. UDP 多接收服务端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class MultiUDPReceiver {
public static void main(String[] args) {
try {
// 指定接收端口
int port = 8080;
// 创建 UDP 套接字
DatagramSocket socket = new DatagramSocket(port);
System.out.println("UDP 多接收服务端已启动...");
// 连续接收多个数据包
while (true) {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
// 接收数据包
socket.receive(packet);
// 提取消息并打印
String receivedMessage = new String(packet.getData(), 0, packet.getLength());
System.out.println("接收消息: " + receivedMessage);
// 若接收到“退出”指令则终止接收
if (receivedMessage.equals("退出")) {
System.out.println("接收到退出指令,关闭服务端...");
break;
}
}
// 关闭套接字
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、总结
- UDP 应用场景:常用于直播、视频通话、在线游戏等。
- 优缺点对比:
- 优点:速度快,适合对实时性要求高的场景。
- 缺点:不保证数据可靠性和顺序性,存在丢包和乱序可能。
- 与 TCP 对比:
- TCP:保证数据传输的可靠性和顺序性,适合文件传输、网页请求等。
- UDP:轻量快速,适合对数据完整性要求不高的实时应用。