找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1133

积分

0

好友

149

主题
发表于 9 小时前 | 查看: 0| 回复: 0

在 Java 中进行网络编程时,我们通常需要根据应用场景选择 TCP 或 UDP 协议。与需要建立稳定连接的 TCP 不同,UDP 是一种无连接的协议,它无需经过三次握手即可发送数据,这使得它在某些实时性要求高、允许少量数据丢失的场景(如音视频流、DNS查询、在线游戏状态同步)中更具优势。

下面,我们将通过一个完整的示例,演示如何使用 Java 的 DatagramSocketDatagramPacket 类来实现 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();
    }
}

IntelliJ IDEA 中的 UDP 服务器端代码及运行结果截图

代码解析:

  1. DatagramSocket socket = new DatagramSocket(9090);:创建一个绑定到本地 9090 端口的 DatagramSocket 对象,用于监听该端口。
  2. DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);:创建一个 DatagramPacket 对象,用于接收数据。我们传入一个字节数组 buffer 作为数据容器。
  3. socket.receive(packet);:这是一个阻塞方法,调用后会一直等待,直到有数据包到达 9090 端口。
  4. 数据到达后,我们可以通过 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();
    }
}

IntelliJ IDEA 中的 UDP 客户端代码及运行结果截图

代码解析:

  1. DatagramSocket socket = new DatagramSocket();:创建一个未绑定的 DatagramSocket,系统会为其分配一个随机的可用端口用于发送。
  2. InetAddress localhost = InetAddress.getByName(“localhost“);:获取本地主机的 IP 地址对象。在实际应用中,这里应替换为接收端服务器的真实 IP 或域名。
  3. DatagramPacket packet = new DatagramPacket(msg.getBytes(),0, msg.getBytes().length, localhost, port);:这是构建数据包的关键。构造方法需要指定要发送的数据字节数组、数据的起始偏移量、数据长度、目标地址和端口。
  4. socket.send(packet);:将构建好的数据包发送出去。

运行与测试

  1. 首先运行 UdpserverDemo01(服务器端)程序。此时程序会阻塞在 socket.receive(packet); 这一行,等待数据。
  2. 接着运行 UdpclientDemo01(客户端)程序。
  3. 观察服务器端控制台,将会打印出发送端的 IP 地址(这里是 127.0.0.1)和消息内容“你好啊,服务器!”。

通过这个简单的例子,我们可以看到基于 Socket 的 UDP 通信模型非常直接。它舍弃了 TCP 的可靠性保障(如确认、重传、排序),换来了更低的延迟和开销。对于想要深入理解网络编程,特别是在Java 中如何处理无连接通信的开发者来说,掌握 DatagramSocketDatagramPacket 的使用是基础且重要的一步。更多关于网络编程的深入讨论和实战经验,欢迎在 云栈社区 与广大开发者交流分享。




上一篇:掌握Python四大高频标准库:开箱即用提升开发效率
下一篇:Linux服务器安全加固指南:防SSH爆破与自动化攻击的4个核心措施
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-9 20:17 , Processed in 0.388882 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表