1.UDP协议核心原理

1. 无连接特性:快速通信的基石

UDP(User Datagram Protocol,用户数据报协议)是TCP/IP协议族中无连接的轻量级传输层协议。与TCP的“三次握手”建立连接不同,UDP通信无需提前建立链路,发送方直接将数据封装成数据报(Datagram)并发送,接收方无需响应确认。这种“即发即走”的特性使得UDP具有极低的通信延迟,尤其适合实时性要求高的场景。

▶ 无连接通信流程示意图

2. 数据报(Datagram):UDP的通信载体

数据报是UDP传输的基本单位,其结构包含:

  • 源端口号(16位):标识发送方应用程序(可选,若无需接收响应可设为0)
  • 目标端口号(16位):标识接收方应用程序(必填,如DNS默认端口53)
  • 数据长度(16位):数据部分的字节数(最大65507字节,受IP层限制)
  • 校验和(16位):可选的错误检测字段(非强制校验,提升传输效率)
  • 数据内容:实际传输的用户数据

▶ 数据报结构示意图

+--------+--------+-----------+-----------+-------------+

| 源端口 | 目标端口 | 数据长度 | 校验和 | 数据内容 |

+--------+--------+-----------+-----------+-------------+

| 2B | 2B | 2B | 2B | N B |

+--------+--------+-----------+-----------+-------------+

3. UDP协议的优缺点对比

优点

缺点

1. 无连接,延迟极低

1. 不保证数据可靠到达

2. 协议头部仅 8 字节,轻量

2. 不保证数据顺序

3. 无需维护连接状态,资源消耗少

3. 无流量控制,易导致丢包

4. 典型适用场景

  • 实时音视频传输:如视频会议(WebRTC)、直播流(RTMP/UDP)、在线游戏(《王者荣耀》使用UDP传输操作指令)
  • 短消息通信:DNS域名解析(UDP默认端口53,单次查询响应)、SNMP网络管理协议
  • 轻量级应用:物联网设备数据上报(如传感器定时发送状态数据)

2.Java中的UDP编程实战

Java通过java.net包提供UDP编程支持,核心类包括:

  • DatagramSocket:负责创建UDP套接字,绑定端口,实现数据报的发送和接收
  • DatagramPacket:封装数据报,包含数据、目标地址、端口等信息

1. 核心类关系图

2. UDP数据报发送与接收流程

▶ 发送流程(客户端)

1. 创建DatagramSocket对象(可选指定本地端口)

2. 将数据转换为字节数组

3. 创建DatagramPacket对象,指定目标IP地址和端口

4. 调用DatagramSocket.send(packet)发送数据报

5. 关闭套接字

▶ 接收流程(服务器端)

1. 创建DatagramSocket对象并绑定监听端口

2. 创建字节数组用于存储接收数据

3. 创建DatagramPacket对象(仅指定字节数组和长度)

4. 调用DatagramSocket.receive(packet)阻塞等待接收数据报

5. 从packet中解析发送方地址、端口和数据

6. 关闭套接字

3. 代码示例:UDP客户端与服务器通信

▶ 示例场景:
  • 客户端向服务器发送文本消息“Hello, UDP!”
  • 服务器接收消息并回复“Received: 你好,UDP!”

① UDP客户端代码(Sender.java)

import java.net.*;
import java.nio.charset.StandardCharsets;public class UDPClient {public static void main(String[] args) {try (DatagramSocket socket = new DatagramSocket()) {  // try-with-resources自动关闭套接字InetAddress serverAddr = InetAddress.getByName("localhost");int serverPort = 8888;String message = "Hello, UDP!";// 构建发送数据报byte[] sendData = message.getBytes(StandardCharsets.UTF_8);DatagramPacket sendPacket = new DatagramPacket(
                sendData, sendData.length, serverAddr, serverPort);            socket.send(sendPacket);System.out.println("发送数据:" + message);// 接收服务器响应(可选)byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            socket.receive(receivePacket);String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("接收响应:" + response);} catch (Exception e) {
            e.printStackTrace();}}
}

② UDP服务器端代码(Receiver.java)

import java.net.*;
import java.nio.charset.StandardCharsets;public class UDPServer {public static void main(String[] args) {try (DatagramSocket socket = new DatagramSocket(8888)) {  // 绑定端口8888System.out.println("服务器启动,监听端口8888...");// 接收数据报byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            socket.receive(receivePacket);String request = new String(receivePacket.getData(), 0, receivePacket.getLength());InetAddress clientAddr = receivePacket.getAddress();int clientPort = receivePacket.getPort();System.out.println("接收到客户端消息:" + request);// 构建响应数据报String response = "Received: 你好,UDP!";byte[] sendData = response.getBytes(StandardCharsets.UTF_8);DatagramPacket sendPacket = new DatagramPacket(
                sendData, sendData.length, clientAddr, clientPort);            socket.send(sendPacket);System.out.println("已发送响应:" + response);} catch (Exception e) {
            e.printStackTrace();}}
}

4. 运行步骤与结果

1. 先启动UDPServer,控制台显示:

   服务器启动,监听端口8888...

2. 再运行UDPClient,客户端输出:

   发送数据:Hello, UDP!
   接收响应:Received: 你好,UDP!
3. 服务器端同步输出:

   接收到客户端消息:Hello, UDP!
   已发送响应:Received: 你好,UDP!

3.注意事项与优化建议

1. 数据报大小限制:单个UDP数据报最大约64KB(实际受MTU限制),超过需在应用层手动分片重组

2. 可靠性增强:若需可靠性,可在应用层实现ACK确认、超时重传机制(如QUIC协议)

3. 端口选择:避免使用1024以下的系统保留端口(如80、443),建议使用1025-65535的端口

4. 异常处理:receive()方法会阻塞线程,建议使用多线程或NIO实现非阻塞通信

4.总结

UDP以其无连接、低延迟的特性,成为实时通信场景的首选协议。Java通过DatagramSocket和DatagramPacket提供了简洁的UDP编程接口,适合开发轻量级网络应用。尽管UDP不保证数据可靠传输,但其高效性在视频直播、游戏等领域不可替代。理解UDP原理并掌握Java编程实践,能帮助开发者更好地选择网络协议,优化应用性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/82927.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/82927.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/82927.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-seamless-scroll 结束从头开始,加延时后滚动

今天遇到一个大屏需求: 1️⃣初始进入页面停留5秒,然后开始滚动 2️⃣最后一条数据出现在最后一行时候暂停5秒,然后返回1️⃣ 依次循环,发现vue-seamless-scroll的方法 ScrollEnd是监测最后一条数据消失在第一行才回调&#xff…

[Protobuf] 快速上手:安全高效的序列化指南

标题:[Protobuf] (1)快速上手 水墨不写bug 文章目录 一、什么是protobuf?二、protobuf的特点三、使用protobuf的过程?1、定义消息格式(.proto文件)(1)指定语法版本(2)package 声明符 2、使用protoc编译器生成代码&…

uniapp调用java接口 跨域问题

前言 之前在Windows10本地 调试一个旧项目,手机移动端用的是Uni-app,vue的版本是v2。后端是java spring-boot。运行手机移动端的首页请求后台接口老是提示错误信息。 错误信息如下: Access to XMLHttpRequest at http://localhost:8080/api/…

[ Qt ] | Qlabel使用

目录 属性 setTextFormat 插入图片 设置图片根据窗口大小实时变化 边框和对其方式 ​编辑 设置缩进 设置伙伴 Qlabel可以用来显式图片和文字 属性 text textFormat Qlabel独有的机制:buddy setTextFormat 插入图片 设置图片根据窗口大小实时变化 Qt中表…

Springboot 项目一启动就获取HttpSession

在 Spring Boot 项目中,HttpSession 是有状态的,通常只有在用户发起 HTTP 请求并建立会话后才会创建。因此,在项目启动时(即应用刚启动还未处理任何请求)是无法获取到 HttpSession 的。 方法一:使用 HttpS…

Step9—Ambari Web UI 初始化安装 (Ambari3.0.0)

Ambari Web UI 安装 如果还不会系统性的部署,或者前置内容不熟悉,建议从Step1 开始阅读。不通版本针对于不同操作系统可能存在差异!这里我也整理好了 https://doc.janettr.com/install/manual/ 1. 进入 Ambari Web UI 并登录 在浏览器中访…

热门大型语言模型(LLM)应用开发框架

我们来深入探索这些强大的大型语言模型(LLM)应用开发框架,并且我会尝试用文本形式描述一些核心的流程图,帮助您更好地理解它们的工作机制。由于我无法直接生成图片,我会用文字清晰地描述流程图的各个步骤和连接。 Lang…

机器学习数据降维方法

1.数据类型 2.如何选择降维方法进行数据降维 3.线性降维:主成分分析(PCA)、线性判别分析(LDA) 4.非线性降维 5.基于特征选择的降维 6.基于神经网络的降维 数据降维是将高维数据转换为低维表示的过程,旨在保…

太阳系运行模拟程序-html动画

太阳系运行模拟程序-html动画 by AI: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>交互式太阳系…

2025年全国青少年信息素养大赛 scratch图形化编程挑战赛 小低组初赛 内部集训模拟题解析

2025年信息素养大赛初赛scratch模拟题解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】 scratch资料 Scratch3.0系列视频课程资料零基础学习scratch3.0【入门教学 免费】零基础学习scratch3.0【视频教程 114节 免费】 历届蓝桥杯scratch国赛真题解析历届蓝桥杯scr…

grid网格布局

使用flex布局的痛点 如果使用justify-content: space-between;让子元素两端对齐&#xff0c;自动分配中间间距&#xff0c;假设一行4个&#xff0c;如果每一行都是4的倍数那没任何问题&#xff0c;但如果最后一行是2、3个的时候就会出现下面的状况&#xff1a; /* flex布局 两…

通义灵码2.5——基于MCP实现我的12306火车票智能查询小助手

本文因排版显示问题&#xff0c;为保证阅读体验&#xff0c;请大家访问&#xff1a; 通义灵码2.5——基于MCP打造我的12306火车票智能查询小助手-CSDN博客 前沿技术应用全景图 本项目作为通义灵码2.5的标杆实践案例&#xff0c;展现了AI辅助开发在复杂业务系统中的革命性突破…

Unity Button 交互动画

在UGUI的Button组件中&#xff0c;有一个过渡动画表现的功能。可以对按钮的不同交互状态添加交互反馈动画&#xff0c;来提高玩家的交互体验。 交互状态 名称 描述 Normal 正常情况 Highlighted 高亮显示&#xff0c;例如鼠标触碰到按钮点击范围 Pressed 按钮被按下的时…

钉钉热点实时推送助理-思路篇

以下是针对热点实时推送助理的功能描述&#xff0c;结合机器学习技术栈与用户场景的通俗化解释&#xff1a; 快速体验的话直接用钉钉扫描下方二维码体验 1. 核心功能 &#xff08;1&#xff09;热点抓取引擎 类比&#xff1a;像蜘蛛爬取全网信息&#xff08;网络爬虫信息抽取…

remote: error: hook declined to update refs/heads.....

gitee拉取分支&#xff0c;修改上传出现的问题&#xff0c;折腾了好久&#xff0c;浅浅记录. 1. 首次克隆仓库 # 克隆仓库&#xff08;使用 HTTPS 或 SSH&#xff09; git clone ------------ cd xxx-project2. 配置正确的用户信息&#xff08;关键步骤&#xff01;&#xff…

使用Vue + Element Plus实现可多行编辑的分页表格

需求背景&#xff1a; 在现代前端开发中&#xff0c;表格作为数据展示和交互的重要组件&#xff0c;在各类管理系统、数据平台中有着广泛的应用。随着用户对数据操作便捷性要求的不断提高&#xff0c;具备灵活编辑功能的表格成为了开发中的常见需求。特别是在需求处理大…

奥威BI+AI——高效智能数据分析工具,引领数据分析新时代

随着数据量的激增&#xff0c;企业对高效、智能的数据分析工具——奥威BIAI的需求日益迫切。奥威BIAI&#xff0c;作为一款颠覆性的数据分析工具&#xff0c;凭借其独特功能&#xff0c;正在引领数据分析领域的新纪元。 一、‌零报表环境下的极致体验‌ 奥威BIAI突破传统报表限…

【机器学习基础】机器学习入门核心算法:K均值(K-Means)

机器学习入门核心算法&#xff1a;K均值&#xff08;K-Means&#xff09; 1. 算法逻辑2. 算法原理与数学推导2.1 目标函数2.2 数学推导2.3 时间复杂度 3. 模型评估内部评估指标外部评估指标&#xff08;需真实标签&#xff09; 4. 应用案例4.1 客户细分4.2 图像压缩4.3 文档聚类…

springboot多模块父pom打包正常,单模块报错

背景&#xff1a;因为项目开发中经常发测试环境&#xff0c;发现使用阿里的插件能一键上传&#xff0c;不用手动上传比较方便。但是多模块有多个启动jar的时候&#xff0c;全局打包太慢&#xff0c;单独打发现报错。这里贴一下我使用这个插件的方式&#xff1a; 附带一个我感觉…

通义灵码2.5——基于MCP打造我的12306火车票智能查询小助手

前沿技术应用全景图 本项目作为通义灵码2.5的标杆实践案例&#xff0c;展现了AI辅助开发在复杂业务系统中的革命性突破。通过深度集成12306 MCP服务体系&#xff0c;我们构建了一个融合智能决策、环境感知和自主优化的新一代火车票查询系统。 #mermaid-svg-4D7QqwJjsQRdKVP7 {…