Java网络编程:UDP协议数据发送与接收完整指南

陈默
陈默
发布时间:2026-10-16 | 4人浏览过
原创

本文介绍了如何在Java中使用UDP协议进行网络数据传输。内容涵盖发送端与接收端的创建流程、数据包封装方法、代码实现及运行顺序,包括从固定字符串发送到键盘动态输入的两个实用案例。

UDP协议概述

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议。相比TCP,它不建立专用的连接,也不保证数据的可靠性和顺序,但具有开销小、速度快的特点,适用于实时性要求高但对少量丢容忍度较高的场景。

准备条件

  1. 已安装Java Development Kit (JDK) 并配置好环境变量。
  2. 拥有具备网络编程基础的Java开发环境(如IDEA、Eclipse等)。
  3. 本地防火墙允许特定端口(如文中使用的 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);
   }
   // 注意:此处不设关闭语句以维持持续监听状态
 }
}

运行与排错提示

  1. 运行顺序:必须先启动接收端代码(ReceiveDemo),使其进入监听状态;随后再启动发送端代码(SendDemo)。
  2. IP地址配置:代码中的 192.168.1.22 仅为示例,实际运行时请替换为接收端所在的真实局域网IP或本机回环地址 127.0.0.1。
  3. 端口冲突:确保接收端监听的端口未被其他程序占用,否则会抛出 BindException。
  4. 异常处理:实际项目中建议对 IOException 进行捕获处理,并使用 try-with-resources 简化资源关闭逻辑。

总结

通过本文的步骤分解与代码示例,您可以清晰地理解Java中UDP通信的底层逻辑。掌握 DatagramSocket 的生命周期管理以及 DatagramPacket 的数据流转过程,是构建高效轻量级网络应用的基础。以上就是Java网络编程UDP协议发送接收数据的详细内容,更多关于Java网络编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表