今天写下 ProtoBuf c#版使用,觉得自己服务器暂时还是使用Protobuf来做网络通信协议吧,比较高效,轻便.如果使用Unity,也可以共同使用.等服务器框架搭建完成,就开始搭建客户端框架,后续应该会使用cocos-lua做客户端开发,后面会继续发lua使用的文章
还是老样子不解释太多,直接写代码,想深入了解其发展历程,原理等,可自行查询或参照官网!
1.首先要拿到这两个dll和一个exe
2.编写proto文件
这里我先写一个消息体结构,作为最上层统一传输结构.
//base.proto
//消息类型
enum msg_type
{
test_type = 1;
}
//消息包
message base_message
{
required msg_type _type = 1;
optional bytes _data = 2;
optional uint32 _ecode = 3;
}
这里的msg_type可看作是交互的协议id
在写一个 test.proto
test.proto
//客户端->服务器
message c2s_test
{
required string arg1 = 1; // (必要的)
optional string arg2 = 2; // (可选的)
}
//服务器->客户端
message s2c_test
{
optional uint32 arg2 = 1; // (可选的)
}
proto文件准备完成,接下来使用 protogen.exe 来生成c#文件
3.生成C#使用的.cs文件
我写了个.bat方便批量导出使用
set Path=E:\__MyWork\Server\Others\ProtoBuf\out
protogen base.proto --csharp_out=%Path%
protogen test.proto --csharp_out=%Path%
pause
双击运行:
这时候我们就有了两个cs文件 base.cs test.cs 导入到我们的vs中使用
4.在VS中使用
1.引入之前的两个dll到工程中
2.导入两个cs文件
3.开始写代码,我在一个工程里省去通讯的步骤,仅进行数据的encode和decode
//客户端
//1.encode
string str1 = "Client Send arg1!";
C2sTest c2s = new C2sTest()
{
Arg1 = str1
};
MemoryStream ms = new MemoryStream();
ProtoBuf.Serializer.Serialize<C2sTest>(ms, c2s);
//2.在打包到继承的消息体
BaseMessage bm = new BaseMessage()
{
Type = MsgType.TestType,
Data = ms.ToArray(),
};
MemoryStream baseMs = new MemoryStream();
ProtoBuf.Serializer.Serialize<BaseMessage>(baseMs, bm);
//TODO 3.SendToServer()
Console.WriteLine("客户端发送数据: " + baseMs.Length);
//服务器
//1.decode
byte[] _data = baseMs.ToArray(); //服务器通过网络接收到的数据
MemoryStream server_basems = new MemoryStream(_data);
BaseMessage recvMsg = Serializer.Deserialize<BaseMessage>(server_basems);
Console.WriteLine("服务器接收到的类型:" +recvMsg.Type);
//2.这里可以根据传输协议的类型 做对应协议解析
if(recvMsg.Type == MsgType.TestType)
{
MemoryStream server_testms = new MemoryStream(recvMsg.Data);
C2sTest testMsg = Serializer.Deserialize<C2sTest>(server_testms);
//3.读取
Console.WriteLine("服务器接收到的数据:" + testMsg.Arg1);
}
输出如下:
5.done
到这里基本就结束了,简单的编码解码过程,后面可以做相关扩展然后使用到项目中去.
下附资源文件,代码就不上传了,有问题请留言,尽量解答!
注:不需要积分.资源下载:https://download.csdn.net/download/zyxjx1314/12359778