Java的UDP通信:DatagramSocket和DatagramPacket

Java的UDP通信:DatagramSocket和DatagramPacket

1、UDP协议简介

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,传输可靠性没有保证。

2、DatagramSocket 类

DatagramSocket 类用于表示发送和接收数据报包的套接字。数据报包套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。

  • DatagramSocket 不保证数据的可靠性和顺序,如果需要可靠性,则必须在应用程序中实现。
  • DatagramSocket 适用于需要低延迟的应用,如流媒体、语音交流和视频会议。
  • DatagramSocketsendreceive 方法不会对传入和传出的数据包执行任何安全检查,除了匹配数据包和套接字的地址和端口。
  • DatagramSocket 在发送数据时,不知道数据报的目的地,而是由 DatagramPacket 自身决定数据报的目的地。

2.1、构造方法

  • DatagramSocket():创建一个绑定到本地地址和随机端口号的 DatagramSocket 实例。
  • DatagramSocket(int port):创建一个绑定到本地默认 IP 地址和指定端口的实例。
  • DatagramSocket(int port, InetAddress laddr):创建一个绑定到特定 IP 地址和端口的实例。
  • DatagramSocket(SocketAddress bindaddr):创建一个绑定到指定本地套接字地址的实例。

2.2、基本方法

  • send(DatagramPacket p):从套接字发送数据报包。
  • receive(DatagramPacket p):从套接字接收数据报包。
  • close():关闭套接字。

3、DatagramPacket 类

java.net 包中的 DatagramPacket 类用来表示数据报包的类,数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

3.1、接收类型

DatagramPacket(byte[] buf, int length):用来接收长度为 length 的 buf 数据(即数据存于字节数组buf中)。

3.2、发送类型

DatagramPacket(byte[] buf, int length, InetAddress address, int port) :将长度为 length 的 buf 数据发送到指定的地址和端口。
DatagramPacket(byte[] buf, int length, SocketAddress address):将length长的buf数据发送到指定的套接字地址处

4、InetAddress类 和 SocketAddress类

InetAddress 只关心 IP 地址(定位到主机)。
SocketAddress 关心的是 IP 地址 + 端口号(定位到主机上的具体应用程序)。

5、代码示例

1、一个发送方UdpSend ,一个接收方UdpReceive 。

2、先运行接收方,再运行发送方。

5.1、UdpReceive

java 复制代码
public class UdpReceive {
    public static void main(String[] args) {
        try (DatagramSocket datagramSocket = new DatagramSocket(8848)) {
            DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
            datagramSocket.receive(datagramPacket); // 接收数据

            byte[] arr = datagramPacket.getData(); // 获取数据
            int len = datagramPacket.getLength(); // 获取有效长度
            System.out.println(new String(arr, 0, len));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5.2、UdpSend

java 复制代码
public class UdpSend {
    public static void main(String[] args) {
        try (DatagramSocket datagramSocket = new DatagramSocket()) {
            byte[] buf = "你好世界".getBytes();
            int length = buf.length;
            InetAddress address = InetAddress.getByName("127.0.0.1");
            int port = 8848;
            // 创建DatagramPacket(要发送的数据,数据的长度,Ip地址,端口)
            DatagramPacket datagramPacket = new DatagramPacket(buf, length, address, port);
            datagramSocket.send(datagramPacket); // 发送
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
相关推荐
Highcharts.js7 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
gwf2168 小时前
RoCEv2无损网络配置实战:PFC与ECN深度调优
网络·网络协议·tcp/ip·udp·tcpdump
头发还在的女程序员9 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats9 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我1234510 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
爱写代码的小朋友11 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华11 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
小小晓.11 小时前
C++:语句和作用域
开发语言·c++
都叫我大帅哥12 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.12 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法