授课语音

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:轻量快速,适合对数据完整性要求不高的实时应用。
去1:1私密咨询

系列课程: