UDP 协议下一发一收通信程序的实现与解析
在网络通信的世界里,UDP 协议以其简洁高效的特点占据着重要地位。它无需建立连接,数据传输速度快,非常适合对实时性要求较高但对数据完整性要求相对宽松的场景。本文将详细解析一个基于 UDP 协议的一发一收通信程序,带你了解其背后的实现原理与代码细节。
程序设计思路
本次实现的 UDP 一发一收程序主要包含客户端和服务器端两个部分。其核心思路是:客户端创建数据并打包发送给指定端口的服务器端,服务器端监听该端口,接收客户端发来的数据并进行解析处理,最后获取客户端的相关信息。整个过程无需建立持久连接,数据的发送和接收通过数据报的形式完成。
客户端代码实现
客户端的主要任务是创建数据并发送给服务器端,具体代码如下:
package com.practical.agreement.utp.utp_1;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*
@description:目标:完成UDP通信快速入门:实现1发1收。
@ClassName Client 客户端
@author chen
@create 2025-07-18 14:22
@Version 1.0
*/
public class Client
{public static void main(String[] args) throws Exception{// 1、创建客户端对象DatagramSocket socket = new DatagramSocket();// 2、创建数据,并把数据打包byte[] data = "客户端数据".getBytes();// 客户端数据int length = data.length;// 数据长度InetAddress ip = InetAddress.getLocalHost();// 服务器地址int port = 8888;// 服务器端口DatagramPacket packet = new DatagramPacket(data,length,ip,port);socket.send(packet);System.out.println("客户端数据发送完毕~~~");socket.close();}
}
在客户端代码中,首先创建了DatagramSocket对象,它是客户端发送数据的关键。然后将需要发送的字符串 “客户端数据” 转换为字节数组,这是因为网络传输的数据是以字节形式存在的。接着,确定服务器的地址(这里使用本地主机)和端口号(8888),并将数据、数据长度、服务器地址和端口号打包到DatagramPacket对象中。最后,通过send方法将数据报发送出去,并关闭DatagramSocket释放资源。
服务器端代码实现
服务器端的主要职责是监听指定端口,接收客户端发来的数据并进行处理,代码如下:
package com.practical.agreement.utp.utp_1;
/*
@description:
@ClassName Server
@author chen
@create 2025-07-18 14:22
@Version 1.0
*/
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class Server
{public static void main(String[] args) throws Exception{System.out.println("----服务端启动----");// 1、创建一个服务端对象 注册端口DatagramSocket socket = new DatagramSocket(8888);// 2、创建一个数据包对象,用于接收数据的byte[] buffer = new byte[1024 * 64];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);// 3、开始正式使用数据包来接收客户端发来的数据socket.receive(packet);// 4、从字节数组中,把接收到的数据直接打印出来// 接收多少就倒出多少// 获取本次数据包接收了多少数据。int len = packet.getLength();String rs = new String(buffer, 0 , len);System.out.println(rs);System.out.println(packet.getAddress().getHostAddress());System.out.println(packet.getPort());socket.close(); // 释放资源}
}
服务器端首先创建DatagramSocket对象并注册端口 8888,以便监听来自该端口的数据。然后创建一个字节数组作为缓冲区,并将其封装到DatagramPacket对象中,用于接收客户端发来的数据。调用receive方法后,服务器端会进入阻塞状态,等待客户端发送数据。当接收到数据后,通过getLength方法获取实际接收的数据长度,再将字节数组转换为字符串并打印出来。同时,还可以通过getAddress和getPort方法获取客户端的 IP 地址和端口号,最后关闭DatagramSocket释放资源。
程序运行效果与意义
运行该程序时,先启动服务器端,此时服务器端会显示 “---- 服务端启动 ----” 并进入等待状态。接着启动客户端,客户端会发送数据并显示 “客户端数据发送完毕~~~”。服务器端接收到数据后,会打印出 “客户端数据” 以及客户端的 IP 地址和端口号。
这个简单的 UDP 一发一收程序虽然功能基础,但却清晰地展示了 UDP 协议的通信过程。它让我们直观地了解到无连接通信的特点,为后续学习更复杂的网络通信程序打下了坚实的基础。在实际应用中,这样的通信模式可以用于实时聊天、游戏数据传输等场景,为各类网络应用提供了高效的数据传输方式。