首页 / 技术文章地图 / 正文

【网络通信】协议设计清单:从字段到版本的游戏协议规范

发布:2026-09-20 07:58 | 作者:996 技术组 | 5 阅读
完整课程入口:996 全套课程体系Lua 学习路径幂尔框架 mirs.cn

协议是最难改的代码

功能代码写错了热更就能修,协议一旦上线就同时活在 N 个历史版本的客户端里,改一个字段要照顾所有还在跑的包体。所以协议设计值得在动手前花足功夫。本文是一份经过实战检验的协议设计清单。

字段层:命名、类型、边界

名字即文档:字段名用完整语义(remain_refresh_times 而不是 rt),协议文件是前后端共同的契约,省这几个字符毫无意义。类型显式:数值字段明确有无符号与位数,金币类字段一律 64 位——32 位上限 21 亿,开服活动翻几倍就溢出,事故级别的经典。边界收敛:字符串字段定义最大长度,数组字段定义最大条数,服务器入口统一裁剪,防止一条 10MB 的昵称打爆内存。

结构层:一条消息只做一件事

单职责消息好维护:LoginReq 就只登录,不要捎带拉取公告。但响应可以适度聚合——打开主界面时一次 SnapshotRes 返回十项关键数据,好过客户端连发十个请求。判断标准是"变更频率与消费场景":一起变化、一起消费的数据放一条消息里。

每个消息必带三个基础字段:seq 序号(去重与重连补发)、result 错误码(统一错误码表,前端据此提示)、可选的提示文本。错误码提前规划区段:1xxx 通用、2xxx 背包、3xxx 任务……新功能申请新区段,避免后期码值打架。

版本层:只加不改不删

协议演进三原则:新增字段只加在末尾,老端解析时会自动跳过未知字段;废弃字段置空保留,绝不复用编号,防止新结构被旧端误解;消息号只增不回收。配套一个版本协商字段:登录时客户端上报支持的协议版本区间,服务器按版本发对应形态的消息。灰度期新旧客户端混跑,靠这套规则保证互不踩踏。

流程层:文档与工具

协议文档(字段表、错误码表、时序图)进版本库与代码同走 review;写一个协议自测工具——按 .proto/定义表自动生成样例请求循环打服务器,新协议上线前跑一遍,字段类型错误当场现形。协议层的投入是典型的"前人栽树":设计时多守的每一条纪律,都是未来三年联调与排障时少流的汗。

消息收发

sendluamsg(actor, msgid, param1, param2, param3, sMsg, sendScope, targetMapId)

发送消息,协议出站统一走这一个口,方便加日志和签名

参数类型说明
actorobject玩家对象(必填参数)
msgidinteger消息ID(必填参数)
param1integer参数1
param2integer参数2
param3integer参数3
sMsgstring消息内容
lua
sendluamsg(actor, 996, 0, 2, 3, "发送给自己的网络消息",0)
sendluamsg(actor, 996, 1, 1, 1, "发送给全服的网络消息",1)

handlerequest(actor, msgid, param1, param2, param3, sMsg)

监听消息,协议入站统一入口,按 msgid 分派到各业务处理函数

参数类型说明
actorobject玩家对象(必填参数)
msgidinteger消息ID(必填参数)
param1integer参数1(必填参数)
param2integer参数2(必填参数)
param3integer参数3(必填参数)
sMsgstring消息内容(必填参数)

字段序列化

tbl2jsonex(str)

表格转换成字符串,把协议字段表转成紧凑串

参数类型说明
strtable需要转表的table

json2tbl(str, reslut)

字符串转换成表格,收到后还原为 table,再走字段校验

参数类型说明
strstring需要转表的json

parsetext(text, object)

解析文本,字段定义写成文本时,用引擎的解析口读取,避免手写 split

参数类型说明
textstring文本内容(必填参数)
objectobject玩家对象(1-50)(必填参数)

签名

md5str(str)

MD5加密,整包摘要随协议带给服务端校验

参数类型说明
strstring“需要加密的文本

广播

sendrefluamsg(actor, msgid, param1, param2, param3, sMsg)

发送视野内广播消息,视野内同步类协议,注意别在广播里塞可变长字段

参数类型说明
actorobject玩家对象(必填参数)
msgidinteger消息ID(必填参数)
param1integer参数1
param2integer参数2
param3integer参数3
sMsgstring消息内容
作者履历与出处
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理,讲解体系出自多年商业端开发生产一线。作者团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
© 威海旷世互娱 · 返回文章地图 · 课程体系 · 幂尔框架