王者荣耀使用的UDP通信,十几年编程没用过的协议
缘起
最近在查阅moba相关的资料时,看到了一篇王者荣耀的研发同学的技术分享,从文章中了解到王者荣耀的通信方式是UDP通信,回想到整个职业生涯,貌似并没有用过,今天特地整理下。
udp技术细节
udp协议
UDP协议叫做用户数据报协议(User Datagram Protocol),UDP协议是一种无需建立连接的、不可靠的、面向数据报的传输层通信协议。
简单理解:UPD就是邮箱模式的协议

udp 数据格式
用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段有 8 个字节,由 4 个字段组成,每个字段都是两个字节。

- 源端口:源端口号。在需要对方回信时选用。不需要时可用全0
- 目的端口:目的端口号。这在终点交付报文时必须使用
- 长度:UDP用户数据报的长度,其最小值是8(UDP 首部+UDP 用户数据报的数据部分)
- 检验和:检测UDP用户数据报在传输中是否有错。有错就丢弃
udp 特点
udp是无连接的,不需要建立连接udp是面向报文的,报文可以理解为邮件,邮件中有发送信息和目标信息- 相比TCP速度更快,因为没有一些控制协议
- 不能保证分组的先后顺序,例如发送数据的顺序为A、B、C,但是接收到的数据顺序却为:A、C、B。产生这个问题的原因在于,每个数据报走的路由并不一样,有的路由顺畅,有的却拥塞,这导致每个数据报到达目的地的顺序就不一样了。UDP协议并不保证数据报的按序接收。
udp没有流量控制,UDP接收数据时直接将数据放进缓冲区内,如果用户没有及时将缓冲区的内容复制出来放好的话,后面的到来的数据会接着往缓冲区放,当缓冲区满时,后来的到的数据就会覆盖先来的数据而造成数据丢失(因为内核使用的UDP缓冲区是环形缓冲区)。因此,一旦发送方在某个时间点爆发性发送消息,接收方将因为来不及接收而发生信息丢失。
udp和tcp对比

一些问题解决方案
- 分组乱序
在包中增加seq,然后接收端增加缓存,保证顺序
- udp流量控制
增大UDP缓冲区,使得接收方的接收能力大于发送方的发送能力。
Java代码实现udp编程

服务端代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** @date 2024/3/20 15:27*/
public class UdpServer {public static void main(String[] args) throws Exception {System.out.println("服务器等待接收消息...");DatagramSocket socket = new DatagramSocket(9999);byte[] data = new byte[1024];DatagramPacket packet = new DatagramPacket(data, data.length);//阻塞等待数据到来socket.receive(packet);int length = packet.getLength();data = packet.getData();String msg = new String(data, 0, length);System.out.println(packet.getSocketAddress());System.out.println(msg);String returnMsg = "from 香菜";data = returnMsg.getBytes();packet = new DatagramPacket(data, 0, data.length, InetAddress.getByName("127.0.0.1"), 9998);socket.send(packet);socket.close();}
}
客户端代码
/*** @date 2024/3/20 15:27*/
public class UdpClient {public static void main(String[] args) throws Exception {System.out.println("请输入您的消息:");Scanner sc = new Scanner(System.in);String msg = sc.next();DatagramSocket socket = new DatagramSocket(9998);byte[] data = msg.getBytes();DatagramPacket packet = new DatagramPacket(data, 0, data.length, InetAddress.getByName("127.0.0.1"), 9999);socket.send(packet);data = new byte[1024];packet = new DatagramPacket(data, data.length);socket.receive(packet);int length = packet.getLength();data = packet.getData();SocketAddress socketAddress = packet.getSocketAddress();System.out.println(socketAddress.toString());System.out.println(new String(data, 0, length));}
}
说明:上面先启动server,然后再启动客户端,然后在客户端控制台随便输入一些文字,可以看到打印

总结
udp就协议上来说要比tcp轻量级,编程上也简单了许多。
可以把整个架构理解为一个邮件系统,而且就协议来说各个节点的角色是一样的,主要看设计者的逻辑写在哪里。
对于任何一个节点来说,监听一个端口,相当于在门口放了一个邮箱。
调试工具的使用
开发中手动创建客户端和服务器来说虽然不难,但是一般在分开调试的时候一般会使用工具。
我这里使用的事NetAssist.exe

总结
整个程序是非常简单的,主要是复习下UDP的编程。
一般的游戏服务器大部分使用TCP,长连接,稳定
在常规的开发中几乎不使用udp,在游戏开发中也就仅仅moba的游戏中看到,原因不外乎,效率高,可以丢失一定的包。
相关文章:
王者荣耀使用的UDP通信,十几年编程没用过的协议
缘起 最近在查阅moba相关的资料时,看到了一篇王者荣耀的研发同学的技术分享,从文章中了解到王者荣耀的通信方式是UDP通信,回想到整个职业生涯,貌似并没有用过,今天特地整理下。 udp技术细节 udp协议 UDP协议叫做用…...
HiveQL详解
文章目录 前言一、数据定义语言(DDL)1. 数据库操作1.1 创建数据库1.2 删除数据库1.3 更改数据库1.4 使用数据库 2. 连接器操作2.1 创建连接器2.2 删除连接器2.3 修改连接器 3. 表操作3.1 创建表3.1.1 内部表与外部表3.1.1.1 内部表3.1.1.2 外部表3.1.1.3…...
Linux/Bizness
Enumeration nmap 用 nmap 扫描了常见的端口,发现对外开放了22,80,443 ┌──(kali㉿kali)-[~] └─$ nmap 10.10.11.252 Starting Nmap 7.93 ( https://nmap.org ) at 2024-03-08 01:21 EST Nmap scan report for 10.10.11.252 Host is up (0.36s latency). Not…...
mysql 数据库 增删改查 基本操作
目录 一 SQL 详细介绍 (一)SQL 分类 (二) SQL 语言规范 (三)数据库对象和命名 1,数据库的组件(对象): 2,命名规则: (四) SQL…...
计算机网络——物理层(编码与调制)
计算机网络——编码与调制 基带信号和宽带信号编码与调制数字数据编码为数字信号非归零编码归零编码反向不归零编码曼彻斯特编码差分曼彻斯特编码4B/5B编码 数字数据调制为模拟信号模拟数据编码为数字信号模拟数据调制为模拟信号 我们之前讲了物理层的一些基础知识和两个准则&a…...
PHP魔术方法详解
__construct() 构造函数用于初始化新创建的对象。PHP 5 之后不推荐使用类名作为构造函数。 class Person {public $name;public $age;public function __construct($name, $age) {$this->name $name;$this->age $age;} }$person new Person("Alice", 30);…...
游戏 AI 反作弊|内附解决方案详情!
我们提出使用在游戏中广泛存在的回放日志数据,重构出玩家当局的表现。在回放 日志数据中,我们构建了玩家的时序行为数据,并基于该时序行为数据,分别搭建 了透视和自瞄外挂检测系统,该方法和系统可广泛应用于各种在线…...
elementUI组件库样式修改整理
一、整体修改样式注意点 避免!important,能使用深度选择器就用深度选择器主题色使用变量,方便后期统一修改,最好新建一个单独的文件,专门用于定义公共变量样式文件尽量放在一个文件里,方便后期维护 二、单独element …...
还是了解下吧,大语言模型调研汇总
大语言模型调研汇总 一. Basic Language ModelT5GPT-3LaMDAJurassic-1MT-NLGGopherChinchillaPaLMU-PaLMOPTLLaMABLOOMGLM-130BERNIE 3.0 Titan 二. Instruction-Finetuned Language ModelT0FLANFlan-LMBLOOMZ & mT0GPT-3.5ChatGPTGPT-4AlpacaChatGLMERNIE BotBard 自从Cha…...
Win11初始化系统遇一文解决
这个是目录 一、设置内的初始化无法使用时,使用以下工具二、将桌面移动到D盘三、解决win11桌面右键创建只有一个带盾牌的文件夹问题四、win11 系统停止更新五、office安装1、使用的是 Office Tool plus2、使用WPS 六、D盘有感叹号七、打开组策略编辑器(gpedit.msc)失…...
vr虚拟现实游戏世界介绍|数字文化展览|VR元宇宙文旅
虚拟现实(VR)游戏世界是一种通过虚拟现实技术创建的沉浸式游戏体验,玩家可以穿上VR头显,仿佛置身于游戏中的虚拟世界中。这种技术让玩家能够全方位、身临其境地体验游戏,与游戏中的环境、角色和物体互动。 在虚拟现实游…...
kotlin 程序 编译与执行
准备kotlin环境 Ubuntu安装kotlin 1. 创建一个名为 hello.kt 文件,代码如下: fun main(args: Array<String>) {println("Hello, World!") }2. 使用 Kotlin 编译器编译应用 kotlinc hello.kt -include-runtime -d hello.jar-d: 用来设…...
Python学习:注释和运算符
python 注释 在Python中,注释用于在代码中添加解释、说明或者提醒,但并不会被解释器执行。Python中的注释以#开头,直到行末为止。下面是关于Python注释的详细解释和举例: 单行注释:使用#符号在行的开头添加注释&…...
英伟达 V100、A100/800、H100/800 GPU 对比
近期,不论是国外的 ChatGPT,还是国内诸多的大模型,让 AIGC 的市场一片爆火。而在 AIGC 的种种智能表现背后,均来自于堪称天文数字的算力支持。以 ChatGPT 为例,据微软高管透露,为 ChatGPT 提供算力支持的 A…...
Spark面试重点
文章目录 1.简述hadoop 和 spark 的不同点(为什么spark更快)2.谈谈你对RDD的理解3.简述spark的shuffle过程4. groupByKey和reduceByKey的区别 1.简述hadoop 和 spark 的不同点(为什么spark更快) Hadoop 和 Spark 是两种用于大数据…...
UGUI源码分析与研究2-从底层实现的角度去分析和调优UI的性能问题和疑难杂症
从底层实现的角度去分析和调优UI的性能问题和疑难杂症,可以从以下几个方面入手: 绘制性能优化:UI的绘制是一个重要的性能瓶颈,可以通过以下方式进行优化: 减少绘制区域:只绘制可见区域,避免不必…...
OpenAI的GPT已达极限,更看好AI Agent
日前,比尔盖茨发表文章表示:AI Agent不仅会改变人与电脑的互动方式,或许还将颠覆软件行业,引领自输入命令到点击图标以来的最大计算机革命。 在数字化和技术创新的浪潮中,AI Agent作为一种前沿技术,正开启…...
【C/C++】详解 assert() 断言(什么是assert? assert有什么作用?)
目录 一、前言 二、什么是 assert ? 三、assert 的用法 四、assert 案例解析 五、assert 断言的使用原则 六、共勉 一、前言 在编写程序过程中,尤其是调试代码时,往往需要一个提醒代码漏洞/Bug的小助手,以便于程序员及时修改和完善代码…...
[C++]20:unorderedset和unorderedmap结构和封装。
unorderedset和unorderedmap结构和封装 一.哈希表:1.直接定址法:2.闭散列的开放定址法:1.基本结构:2.insert3.find4.erase5.补充:6.pair<k,v> k的数据类型: 3.开散列的拉链法/哈希桶:1.基…...
ARM 汇编指令:(六) B 跳转指令
目录 一.B 和 BL 1.B/BL指令的语法格式 2.示例解析 一.B 和 BL 跳转指令 B 使程序跳转到指定的地址执行程序。指令 BL 将下一条指令的地址复制到 R14(即返回地址连接寄存器 LR)寄存器中,然后跳转到指定地址运行程序。 1.B/B…...
混音教学第五课|从零认识 RVC:软件启动全流程真机实操(GTX1050Ti 专属)
作者:龙沅可 各位音乐编程圈的兄弟,我是深耕实战 3 年的地下程序员胡桃。前面我们走完了人声分离、软件模型全套准备、Anaconda 环境兜底、VOCALOID&RVC 选择杂谈、官方作品技术复盘 个人修复版全流程,本期终于回归主线实操,…...
5分钟学会B站M4S转MP4:快速免费的视频格式转换终极方案
5分钟学会B站M4S转MP4:快速免费的视频格式转换终极方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾遇到过这样的困境&am…...
AppImageLauncher深度解析:Linux桌面应用智能集成解决方案
AppImageLauncher深度解析:Linux桌面应用智能集成解决方案 【免费下载链接】AppImageLauncher Helper application for Linux distributions serving as a kind of "entry point" for running and integrating AppImages 项目地址: https://gitcode.com…...
GCN的‘死穴’与进化:从ST-GCN的耦合聚集缺陷,聊聊图神经网络下一步怎么走
GCN的耦合聚集困境与解耦进化路径:从ST-GCN缺陷到下一代图神经网络设计 当我们在计算机视觉领域习惯了CNN的强大性能后,转向图神经网络(GNN)时总会感到一丝"水土不服"。这种不适感的根源,很大程度上来自于图卷积(GCN)中那个看似合理…...
Qt6实战:用setGeometry和事件过滤器,实现一个可拖拽调整大小的自定义控件(附完整源码)
Qt6实战:打造可拖拽调整大小的Photoshop风格浮动面板 在图形界面开发中,能够自由拖拽和调整大小的浮动面板是专业级应用的标配功能。就像Photoshop的工具箱那样,用户可以随心所欲地摆放工作区组件。本文将带你用Qt6实现这样一个工业级交互控件…...
【二】2D测量 Metrology——set_metrology_object_param()算子参数详解与实战调优
1. set_metrology_object_param()算子基础解析 在工业视觉检测中,精确的2D测量往往决定着产品质量控制的成败。Halcon的Metrology工具包提供了一套完整的解决方案,其中set_metrology_object_param()就像测量工程师的瑞士军刀,负责微调每个测量…...
MT5中文增强镜像GPU算力优化教程:FP16量化+梯度检查点降低显存占用50%
MT5中文增强镜像GPU算力优化教程:FP16量化梯度检查点降低显存占用50% 你是不是也遇到过这种情况:好不容易找到一个好用的中文文本增强工具,比如基于mT5的改写模型,兴致勃勃地部署到自己的GPU服务器上,结果一运行就提示…...
AGI数学证明能力测评报告(2026Q1):仅17%模型通过ZFC一致性子集测试,你的系统在第几层?
第一章:AGI数学证明能力测评报告(2026Q1)核心结论发布 2026奇点智能技术大会(https://ml-summit.org) 本季度测评覆盖全球17个主流AGI系统,聚焦形式化定理证明、构造性证明生成与跨公理体系一致性验证三大维度,在Coq…...
2026奇点大会闭门圆桌实录:AGI训练能耗 vs 气候收益的黄金平衡点(附12国算力调度协议原始签字页扫描件)
第一章:2026奇点智能技术大会:AGI与气候变化 2026奇点智能技术大会(https://ml-summit.org) 本届大会首次将通用人工智能(AGI)系统级能力与全球气候建模、减碳路径优化及极端天气预测深度耦合,标志着AI从工具性辅助迈…...
5个维度重构交易决策:如何构建下一代几何交易系统
5个维度重构交易决策:如何构建下一代几何交易系统 【免费下载链接】chanvis 基于TradingView本地SDK的可视化前后端代码,适用于缠论量化研究,和其他的基于几何交易的量化研究。 缠论量化 摩尔缠论 缠论可视化 TradingView TV-SDK 项目地址:…...
