在 Java 中进行网络编程时,我们通常需要根据应用场景选择 TCP 或 UDP 协议。与需要建立稳定连接的 TCP 不同,UDP 是一种无连接的协议,它无需经过三次握手即可发送数据,这使得它在某些实时性要求高、允许少量数据丢失的场景(如音视频流、DNS查询、在线游戏状态同步)中更具优势。
下面,我们将通过一个完整的示例,演示如何使用 Java 的 DatagramSocket 和 DatagramPacket 类来实现 UDP 消息的发送与接收。
UDP 接收端(服务器)
接收端的主要任务是监听指定端口,接收来自发送端的数据包并处理。其核心流程是:创建 DatagramSocket 并绑定端口 -> 准备一个字节数组和 DatagramPacket 用于接收数据 -> 调用 receive() 方法阻塞等待数据 -> 处理接收到的数据 -> 关闭 Socket。
以下是一个 UDP 接收服务器的完整代码:
package lesson03;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpserverDemo01 {
public static void main(String[] args) throws IOException {
//开放端口
DatagramSocket socket = new DatagramSocket(9090);
//接收数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);//阻塞接收
System.out.println(packet.getAddress().getHostAddress());
System.out.println(new String(packet.getData(),0,packet.getLength()));
//关闭连接
socket.close();
}
}

代码解析:
DatagramSocket socket = new DatagramSocket(9090);:创建一个绑定到本地 9090 端口的 DatagramSocket 对象,用于监听该端口。
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);:创建一个 DatagramPacket 对象,用于接收数据。我们传入一个字节数组 buffer 作为数据容器。
socket.receive(packet);:这是一个阻塞方法,调用后会一直等待,直到有数据包到达 9090 端口。
- 数据到达后,我们可以通过
packet.getAddress() 获取发送方的 IP 地址,通过 packet.getData() 和 packet.getLength() 获取实际接收到的数据内容。
UDP 发送端(客户端)
发送端的任务是构建包含目标地址和数据的包,并通过 Socket 将其发送出去。它不需要预先与接收端建立连接。核心步骤是:创建 DatagramSocket -> 构建包含数据和目标地址(IP + 端口)的 DatagramPacket -> 调用 send() 方法发送 -> 关闭 Socket。
下面是客户端的实现代码:
package lesson03;
import java.io.IOException;
import java.net.*;
//不需要连接服务器
public class UdpclientDemo01 {
public static void main(String[] args) throws IOException {
//1、建立一个SOCKET
DatagramSocket socket = new DatagramSocket();
//2、建个包
String msg = "你好啊,服务器!";
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
//数据,数据的长度起始,要发送给谁
DatagramPacket packet = new DatagramPacket(msg.getBytes(),0, msg.getBytes().length, localhost, port);
//3、发送包
socket.send(packet);
//4、关闭流
socket.close();
}
}

代码解析:
DatagramSocket socket = new DatagramSocket();:创建一个未绑定的 DatagramSocket,系统会为其分配一个随机的可用端口用于发送。
InetAddress localhost = InetAddress.getByName(“localhost“);:获取本地主机的 IP 地址对象。在实际应用中,这里应替换为接收端服务器的真实 IP 或域名。
DatagramPacket packet = new DatagramPacket(msg.getBytes(),0, msg.getBytes().length, localhost, port);:这是构建数据包的关键。构造方法需要指定要发送的数据字节数组、数据的起始偏移量、数据长度、目标地址和端口。
socket.send(packet);:将构建好的数据包发送出去。
运行与测试
- 首先运行
UdpserverDemo01(服务器端)程序。此时程序会阻塞在 socket.receive(packet); 这一行,等待数据。
- 接着运行
UdpclientDemo01(客户端)程序。
- 观察服务器端控制台,将会打印出发送端的 IP 地址(这里是
127.0.0.1)和消息内容“你好啊,服务器!”。
通过这个简单的例子,我们可以看到基于 Socket 的 UDP 通信模型非常直接。它舍弃了 TCP 的可靠性保障(如确认、重传、排序),换来了更低的延迟和开销。对于想要深入理解网络编程,特别是在Java 中如何处理无连接通信的开发者来说,掌握 DatagramSocket 和 DatagramPacket 的使用是基础且重要的一步。更多关于网络编程的深入讨论和实战经验,欢迎在 云栈社区 与广大开发者交流分享。
|