Java Socket -- UDP通信
文章目录
- 前言
- UDP 协议
- UDP 服务器端示例
- UDP 客户端示例
- 示例说明
- 运行步骤
- 运行结果
- 注意事项
前言
当你迷茫的时候,请点击 目录大纲 快速查看前面的技术文章,相信你总能找到前行的方向
另外,本文相关代码已上传 gitee仓库,欢迎关注收藏
UDP 协议
UDP (User Datagram Protocol) 是一种无连接的传输层协议,Java 提供了 DatagramSocket
和 DatagramPacket
类来实现 UDP 通信。下面是一个简单的 UDP 示例,包含服务器端和客户端代码。
UDP 服务器端示例
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class UDPServer {public static void main(String[] args) {try {// 创建DatagramSocket,监听指定端口DatagramSocket serverSocket = new DatagramSocket(9876);System.out.println("UDP服务器已启动,等待客户端连接...");byte[] receiveData = new byte[1024];while (true) {// 创建接收数据包DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);// 接收数据serverSocket.receive(receivePacket);// 解析数据String message = new String(receivePacket.getData(), 0, receivePacket.getLength());InetAddress clientAddress = receivePacket.getAddress();int clientPort = receivePacket.getPort();System.out.println("收到来自 " + clientAddress + ":" + clientPort + " 的消息: " + message);// 准备响应消息String responseMessage = "服务器已收到你的消息: " + message;byte[] sendData = responseMessage.getBytes();// 创建发送数据包DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);// 发送响应serverSocket.send(sendPacket);}} catch (Exception e) {e.printStackTrace();}}
}
UDP 客户端示例
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;public class UDPClient {public static void main(String[] args) {try {// 创建DatagramSocketDatagramSocket clientSocket = new DatagramSocket();// 获取服务器地址InetAddress serverAddress = InetAddress.getByName("localhost");Scanner scanner = new Scanner(System.in);while (true) {System.out.print("请输入要发送的消息(输入exit退出): ");String message = scanner.nextLine();if ("exit".equalsIgnoreCase(message)) {break;}// 准备发送数据byte[] sendData = message.getBytes();// 创建发送数据包DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 9876);// 发送数据clientSocket.send(sendPacket);// 准备接收响应byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);// 接收响应clientSocket.receive(receivePacket);// 解析响应String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("服务器响应: " + response);}// 关闭资源clientSocket.close();scanner.close();} catch (Exception e) {e.printStackTrace();}}
}
示例说明
-
服务器端:
- 创建
DatagramSocket
并绑定到指定端口(9876) - 使用
receive()
方法阻塞等待客户端消息 - 收到消息后,获取客户端地址和端口
- 发送响应消息回客户端
- 创建
-
客户端:
- 创建
DatagramSocket
(不绑定特定端口,系统自动分配) - 从控制台读取用户输入
- 将消息发送到服务器
- 等待并接收服务器响应
- 创建
运行步骤
- 先运行服务器端程序(UDPServer)
- 然后运行客户端程序(UDPClient)
- 在客户端控制台输入消息,服务器会响应并显示
运行结果
注意事项
- UDP是无连接协议,不保证消息的可靠传输
- 数据包大小有限制(通常不超过64KB)
- 适合对实时性要求高但允许少量丢包的应用,如视频流、在线游戏等
- 如果需要可靠传输,需要在应用层实现确认和重传机制