定义网络通信协议¶
在客户端与服务器之间,乃至服务器与服务器之间进行通信时,通常需要定义专门的协议来确保数据的可靠传输与处理。这些协议可以根据应用的具体需求进行定制,从而满足不同的传输效率、安全性和可靠性要求。例如,针对高实时性要求的应用,可能需要设计轻量级且低延迟的协议,而对于需要保证数据完整性和安全性的场景,则可能更侧重于加密和验证机制的实现。
支持的协议¶
MemoryPack¶
MemoryPack 是一个高性能的序列化库,专门为 .NET 环境设计,效率极其优秀,常用于客户端与服务器之间、以及服务器之间的通信。它能够将复杂的数据结构压缩为紧凑的二进制格式,从而提高传输速度并减少带宽消耗。
该协议默认不包含在框架的主体部分,需要通过添加扩展包将其引入框架。具体的扩展包位于 Fantasy.Packages/Fantasy.MemoryPack 文件夹中,文件夹内包含详细的使用说明。此外,我将会撰写一篇文章,深入介绍该协议的扩展使用方法,帮助大家更好地理解和应用。
Protobuf¶
Protobuf(Protocol Buffers)是由 Google 开发的一种轻量、高效的跨平台数据序列化格式,常用于数据传输或持久化。它采用紧凑的二进制格式,使得序列化后的数据体积小、处理速度快,尤其适用于网络通信或大规模数据存储等场景。
BSON¶
BSON是 MongoDB 使用的一种二进制格式,由于框架支持将实体(Entity)直接存储到 MongoDB 中,在服务器之间传递实体对象时,使用 BSON 格式能够简化很多操作。如果选择 MemoryPack或Protobuf 格式,就必须先定义结构,然后接收方还要将数据还原成实体,这个过程比较繁琐。而使用 BSON 格式,接收方可以直接接收到并使用实体对象,避免了额外的处理步骤。因此,在服务器内部传递实体对象时,BSON 是一种非常高效和方便的选择。
协议文件夹¶
在1.2.配置文件部分,安装完成后,系统会自动生成一个名为 NetworkProtocol 的文件夹。该文件夹中包含了用于配置网络协议的重要文件,这些文件负责定义和管理网络通信的参数和规则。用户可以根据需要对这些文件进行修改,以优化网络性能或满足特定的网络需求。
目录结构图¶
├─ Docs
├─ Fantasy.Packages/
│ ├─ Fantasy.Config/
│ │ └─ Config/
│ │ ├─ Excel # Excel格式的4个启动配置文件
│ │ ├─ Json/ # Json格式的4个启动配置文件
│ │ └─ NetworkProtocol/ # 网络协议配置文件
│ │ ├─ Inner/ # 服务器之间通讯的网络协议
│ │ ├─ Outer/ # 发送端到服务器之间通讯的网络协议
│ │ └─ RouteType.Config # 自定义Route协议配置文件
│ └─ Fantasy.NLog
└─ README.md
Inner¶
用于服务器之间通讯的网络协议可以通过定义多个文件来实现,这些文件的扩展名必须为 .proto。该文件夹中定义的协议在传输过程中会自动序列化为 MessagePack 格式,以确保数据的高效传输。然而,这种协议仅适用于服务器之间的通讯,不适用于客户端与服务器之间的通讯。
Outer¶
用于定义客户端与服务器之间的通讯可以通过定义多个文件来实现,传输时使用高效的MessagePack格式,以减少数据量并提高传输性能。文件扩展名必须为 .proto,因为协议采用了ProtoBuf格式进行定义,从而确保了结构化数据的标准化传输。为了避免潜在错误,系统支持同时定义多个协议文件,尤其适用于复杂场景中的模块化设计。需要特别注意的是,这些协议文件仅限用于客户端与服务器之间的通讯。如果用于服务器之间的通讯,系统将会抛出不支持此类操作的异常。
导出协议工具¶
导出协议工具可以将协议导出为 C# 文件,以供项目使用。这种导出功能不仅提高了开发效率,还确保了项目与框架之间的兼容性,使开发人员能够更轻松地实现网络通信。
通过下面的任意一种方式可以获得导出协议工具的可执行文件。
仓库源代码获取¶
仓库的根目录下Tools/Exporter/NetworkProtocol的文件夹
NuGet¶
# 安装方式一:使用以下命令安装包
dotnet add package Fantasy-Net.Tools.ExporterNetworkProtocol
# 安装方式二:通过 NuGet 包管理工具搜索 Fantasy-Net.Tools.ExporterNetworkProtocol 进行安装。
配置导出路径¶
通过对 NetworkProtocol 文件夹中的 ExporterSettings.json 文件进行配置,您可以指定导出 C# 文件的目标目录。确保导出的 C# 文件保存到您指定的位置。此外,请确保路径的格式正确,以避免导出过程中的错误。
ExporterSettings.json结构
{
"Export": {
"NetworkProtocolDirectory": {
"Value": "../../Examples/Config/NetworkProtocol/",
"Comment": "网络协议文件所在的文件夹位置"
},
"NetworkProtocolServerDirectory": {
"Value": "../../Examples/Server/Entity/Generate/NetworkProtocol/",
"Comment": "网络协议生成到服务端的文件夹位置"
},
"NetworkProtocolClientDirectory": {
"Value": "../../Examples/Client/Unity/Assets/Scripts/Hotfix/Generate/NetworkProtocol/",
"Comment": "网络协议生生成到客户端的文件夹位置"
},
"Serializes": {
"Value": [],
"Comment": "自定义序列化器"
}
}
}
运行导出协议工具¶
在NetworkProtocol的文件夹里有Run.sh/Run.bat两个启动文件。
分别对应Linux和Windows平台。
找到自己对应的平台执行这个启动文件按照操作提示运行。
切换协议¶
用户可以在协议文件里随意切换MessagePack、Protobuf、BSON这三种协议。
在message协议上方添加// Protocol+空格+协议名字。
例如:// Protocol ProtoBuf 或 // Protocol MemoryPack
注意
BSON协议只能定义在Inner文件夹里的协议,Outer里的文件不可以使用
切换协议
协议格式¶
注意
所有格式都是通过空格进行连接的。
例如:// IMessage、// IRequest。特别需要注意的是,// 后面一定要加一个空格,再加上对应的类型名称。
– IMessage¶
普通的网络消息,可以在定义的消息后面加上一个空格符号,注释为 // IMessage。
– IRequest¶
RPC网络消息的请求部分,可以在消息定义的末尾添加一个空格符号,并注释 // IRequest。
唯一的不同点是,在IRequest后面还需要指定对应的RPC返回消息。
可以在IRequest之后用逗号分隔,并紧接着写上RPC返回消息的名称。
– IResponse¶
请求消息(IRequest)的响应,可以在定义的消息后面加上一个空格符号,注释为 // IResponse。
这种做法确保了每个IRequest都有一个对应的IResponse,从而实现请求与响应的明确对应关系。
协议数据类型¶
下面列出了协议能支持和明确不支持的数据类型。
类型 | 是否支持 |
---|---|
string | |
int64 | |
int32 | |
bool | |
byte | |
bytes | |
message | |
float | |
uint32 | |
uint64 | |
uint64 | |
double | |
enum | |
Dictionary |
数组类型(repeated)¶
如果需要在协议中定义数组类型,应使用 repeated 关键字。
具体操作是在数据类型前加上 repeated,这样可以表示该字段是一个数组,包含零个或多个同类型的元素。