今天准备给大家介绍一个c#服务器框架(SuperSocket)和一个c#客户端框架(SuperSocket.ClientEngine)。这两个框架的作者是园区里面的江大渔。 首先感谢他的无私开源贡献。之所以要写这个文章是因为群里经常有人问这个客户端框架要如何使用。原因在于服务端框架的文档比较多,客户端的文档比较少,所以很多c#基础比较差的人就不懂怎么玩起来。今天就这里写一个例子希望能给部分人抛砖引玉吧。
参考资料:
SuperSocket文档 http://docs.supersocket.net/
我以前在开源中国的一部分文章:http://my.oschina.net/caipeiyu/blog
这篇文章选择 protobuf 来实现,选择protobuf是因为服务器有可能用的是java的netty,客户端想用SuperSocket.ClientEngine,而netty我看很多人经常用protobuf。
一、SuperSocket服务器
新建一个项目 ProtobufServer 然后添加 SuperSocket 和 protobuf 的依赖包。
添加protobuf依赖包 输入的搜索词是 Google.ProtocolBuffers
添加SuperSocket依赖包 输入搜索词是 SuperSocket,要添加两个SuperSocket.Engine 和 SuperSocket
上面的工作完成后,我们就应该来实现我们的传输协议了。传输协议打算参考netty的ProtobufVarint32FrameDecoder.java
* BEFORE DECODE (302 bytes) AFTER DECODE (300 bytes)* +--------+---------------+ +---------------+* | Length | Protobuf Data |----->| Protobuf Data |* | 0xAC02 | (300 bytes) | | (300 bytes) |* +--------+---------------+ +---------------+
Protobuf Data是protobuf的序列化结果。Length(Base 128 Varints)是表示Protobuf Data的长度。protobuf本身的序列号协议可以参考:https://developers.google.com/protocol-buffers/docs/encoding
我们先看一下SuperSocket的内置的常用协议实现模版看看有没有合适我们可以直接拿来用的。因为Length使用的是Base 128 Varints一种处理整数的变长二进制编码算法,所以呢内置的协议实现模板并不能直接拿来使用,所以我们只能自己来实现接口IRequestInfo和IReceiveFilter了,参考:使用 IRequestInfo 和 IReceiveFilter 等等其他对象来实现自定义协议。
这里说明一下:为什么protobuf明明序列化成Protobuf