Java重修笔记 UDP 网络通信

UDP 网络通信原理
  1. 类 DatagramSocket 和 DatagramPacket 数据包/数据报 实现了基于 UDP协议网络程序。

  2. UDP 数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达,所以 UDP 是不可靠的

  3. DatagramPacket 对象封装了 UDP 数据报,在数据报中包含了发送端的 IP 地址和端口号以及接收端的 IP 地址和端口号。

  4. UDP 协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接

UDP 网络通信实现过程
  1. 核心的两个类/对象DatagramSocket与DatagramPacket

  2. 建立发送端,接收端(没有服务端和客户端概念)

  3. 发送数据前,建立数据包/报DatagramPacket对象

  4. 调用DatagramSocket的发送、接收方法

  5. 关闭DatagramSocket

java 复制代码
public class UDPReceiverA {
    public static void main(String[] args) throws IOException {
        // 创建一个 DatagramSocket 对象, 准备在端口 9999 接受数据
        DatagramSocket socket = new DatagramSocket(9999);
        // 创建一个 DataGramPacket 对象, 用来接收数据, 最大可以传 64kb 的数据
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        // 调用接收方法, 将信息填充到 packet 对象中, 若没有接收到数据 则会阻塞
        System.out.println("接收端 A 等待接收数据");
        socket.receive(packet);
        // 拆包, 取出 packet 中的数据
        int length = packet.getLength(); // 实际接收到的数据的长度
        byte[] data = packet.getData(); // 接收到的数据
        String string = new String(data, 0, length);
        System.out.println(string);

        // 回复
        // 将需要发送的数据封装到 DatagramPacket 对象中
        data = "copy that UDP".getBytes(StandardCharsets.UTF_8);
        packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.4"), 9998);
        // 发送
        socket.send(packet);

        // 关闭资源
        socket.close();
        System.out.println("B 端退出");
    }
}
java 复制代码
public class UDPSenderB {
    public static void main(String[] args) throws IOException {
        // 创建 DataGramSocket 对象, 设置用哪个端口进行发送, 注意同一台机器上不要和接收端的端口冲突
        DatagramSocket socket = new DatagramSocket(9998);
        // 将需要发送的数据封装到 DatagramPacket 对象中
        byte[] data = "hello UDP".getBytes(StandardCharsets.UTF_8);
        DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.4"), 9999);
        // 发送
        socket.send(packet);

        // 接收回复
        // 创建一个 DataGramPacket 对象, 用来接收数据, 最大可以传 64kb 的数据
        byte[] buf = new byte[1024];
        packet = new DatagramPacket(buf, buf.length);
        // 调用接收方法, 将信息填充到 packet 对象中, 若没有接收到数据 则会阻塞
        socket.receive(packet);
        // 拆包, 取出 packet 中的数据
        int length = packet.getLength(); // 实际接收到的数据的长度
        data = packet.getData(); // 接收到的数据
        String string = new String(data, 0, length);
        System.out.println(string);

        // 关闭资源
        socket.close();
        System.out.println("B 端退出");
    }
}
相关推荐
腻害兔6 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社7 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
克里斯蒂亚诺更新7 小时前
ruoyi角色权限的对应关系
笔记
萧瑟余晖8 小时前
JDK 26 新特性详解
java·开发语言
马优晨9 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
a11177610 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
维天说11 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
破碎的南瓜11 小时前
sqli--sql注入过关笔记(1,2,3,4,5,9)
数据库·笔记·sql
Zane199412 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
你想知道什么?12 小时前
线性回归-学习笔记
笔记·学习·线性回归