Java网络编程:UDP协议数据发送与接收完整指南
本文介绍了如何在Java中使用UDP协议进行网络数据传输。内容涵盖发送端与接收端的创建流程、数据包封装方法、代码实现及运行顺序,包括从固定字符串发送到键盘动态输入的两个实用案例。
UDP协议概述
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议。相比TCP,它不建立专用的连接,也不保证数据的可靠性和顺序,但具有开销小、速度快的特点,适用于实时性要求高但对少量丢容忍度较高的场景。
准备条件
- 已安装Java Development Kit (JDK) 并配置好环境变量。
- 拥有具备网络编程基础的Java开发环境(如IDEA、Eclipse等)。
- 本地防火墙允许特定端口(如文中使用的
10010端口)的出入站通信。
UDP发送数据流程与实现
在Java中,发送数据主要通过 java.net.DatagramSocket 和 java.net.DatagramPacket 类完成。基本操作步骤如下:
第1步:创建发送端Socket对象
目的:建立用于发送数据的数据报套接字。
操作:实例化 DatagramSocket 时若不指定端口,系统会自动分配一个空闲端口。
// 创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();
第2步:准备数据并打包
目的:将待发送的字节数组转换为包含目标地址信息的 DatagramPacket。
参数说明:
byte[] by:要发送的数据缓冲区。InetAddress addr:接收方的IP地址。int port:接收方监听的端口号。
// 准备数据
byte[] by = "Hello,UDP".getBytes();
InetAddress addr = InetAddress.getByName("192.168.1.22");
int port = 10010;
// 创建数据包(打包)
DatagramPacket dp = new DatagramPacket(by, by.length, addr, port);
第3步:调用发送方法
操作:执行 send() 方法将数据包推送到网络。
ds.send(dp);
第4步:释放资源
操作:关闭Socket连接。
ds.close();
UDP接收数据流程与实现
接收端需监听特定端口,阻塞等待数据包到达。
第1步:创建接收端Socket对象
操作:必须指定一个具体的端口号,以便与发送端的目标端口一致。
// 监听10010端口
DatagramSocket ds = new DatagramSocket(10010);
第2步:创建接收容器(数据包)
操作:创建一个空的 DatagramPacket 作为数据缓冲区,容量设为1024字节。
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by, by.length);
第3步:阻塞接收数据
操作:receive() 方法是阻塞式的,直到收到数据才会继续向下执行。
ds.receive(dp);
第4步:解析数据并显示
操作:从 DatagramPacket 中提取源IP地址和数据内容,并进行转换输出。
// 获取发送者IP
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
// 获取实际收到的数据长度
byte[] data = dp.getData();
int len = dp.getLength(); // 推荐使用getLength()而非getData().length
String message = new String(data, 0, len);
System.out.println(ip + "发送的数据是:" + message);
第5步:释放资源
ds.close();
增强版:键盘录入与循环收发
在实际应用中,通常需要连续收发数据。以下示例展示了通过控制台输入发送消息,接收端持续监听直到主动退出的逻辑。
发送端:支持多次输入
引入 BufferedReader 读取用户输入,通过死循环等待指令。当输入“jieshu”时退出程序。
package net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDemo {
public static void main(String[] args) throws IOException {
// A. 创建Socket
DatagramSocket ds = new DatagramSocket();
// 初始化键盘流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
// C. 循环发送
while((line = br.readLine()) != null){
if("jieshu".equals(line)){
break; // 结束循环
}
// B. 打包数据
byte[] by = line.getBytes();
InetAddress addr = InetAddress.getByName("192.168.1.22");
int port = 10010;
DatagramPacket dp = new DatagramPacket(by, by.length, addr, port);
// 发送
ds.send(dp);
}
// D. 释放资源
ds.close();
}
}
接收端:循环接收
接收端采用 while(true) 循环持续监听,无需频繁重建Socket,提高效率。
package net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// A. 创建Socket(指定端口)
DatagramSocket ds = new DatagramSocket(10010);
// 循环接收
while(true){
// B. 创建接收容器
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by, by.length);
// C. 阻塞接收
ds.receive(dp);
// D. 解析与输出
InetAddress addr = dp.getAddress();
String ip = addr.getHostAddress();
byte[] by2 = dp.getData();
int len = dp.getLength();
String s = new String(by2, 0, len);
System.out.println(ip + " 发送的数据是:" + s);
}
// 注意:此处不设关闭语句以维持持续监听状态
}
}
运行与排错提示
- 运行顺序:必须先启动接收端代码(ReceiveDemo),使其进入监听状态;随后再启动发送端代码(SendDemo)。
- IP地址配置:代码中的
192.168.1.22仅为示例,实际运行时请替换为接收端所在的真实局域网IP或本机回环地址127.0.0.1。 - 端口冲突:确保接收端监听的端口未被其他程序占用,否则会抛出
BindException。 - 异常处理:实际项目中建议对
IOException进行捕获处理,并使用 try-with-resources 简化资源关闭逻辑。
总结
通过本文的步骤分解与代码示例,您可以清晰地理解Java中UDP通信的底层逻辑。掌握 DatagramSocket 的生命周期管理以及 DatagramPacket 的数据流转过程,是构建高效轻量级网络应用的基础。以上就是Java网络编程UDP协议发送接收数据的详细内容,更多关于Java网络编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









