在网络游戏中,通信协议是其中必不可少的组成部分。一个通信协议的大小、结构将与服务器负载及客户端延迟息息相关。
前言
游戏的通信协议,一般需要考虑 2 个部分:
网络传输协议
数据交换格式
网络传输协议
根据游戏类型的不同,网络传输协议选择也有些许不同。比如:
- 弱联网类型
单工/半双工通信协议:HTTP1.0、HTTP1.1
- 强联网、强交互类型
全双工通信协议:WebSocket、TCP
- 强联网、实时交互类型
UDP
单工、半双工及全双工通信协议的区别用 3 张图来表示一下,具体内容留到下篇学习笔记再水…
单工
半双工
全双工
数据交换格式
对于数据交换格式来说,需要解决的最主要的问题就是内容语义清晰,结构稳定,通俗地说不同的程序都可以稳定的解析并且知道怎样去处理它们。
对于数据结构,一般有以下几个选择:
- XML
可读性高,解析难度高
- JSON
可读性高、易解析、体积小
- Protocol Buffers
可读性差、易解析、体积特别小
在确定数据交换协议后,还需要制定数据交换的格式,保证数据不会出现歧义。比如下图这样的格式(未考虑加密)。

从左向右结构:头字节表示协议名称的长度、中间部分是协议名称、最后是协议的具体数据(可以是XML、JSON、PB等)。
实现逻辑
使用 WebSocket + PB 来实现一套通信协议,实现一个简易登录协议。
协议文件
1 | syntax = "proto3"; |
服务端核心逻辑
1 | agent := &Agent{ |
packet/packet.go
1 | package packet |
附上完整实现:
protocol-demo