SuperSocket 1.5 Documentation译文 7 ----- 内置的通用格式“通讯协定”的的实现工具
阅读以前的文档后,你可能会发现使用SuperSocket实现自己的协议对你可能是不容易的。为了使这项工作更容易,SuperSocket提供了一些常用的协议工具,你可以很容易和快速的用它来建立自己的协议,。
终端协议
类似的命令行协议,有些协议使用一个终端识别请求。例如,一个协议使用两个字符“##”作为结束,那么你可以使用“TerminatorReceiveFilterFactory”类:
/// <summary> /// 终端协议服务器 /// 每个终端请求以 “##” 结束 /// ECHO 你的消息 ## /// </summary> public class TerminatorProtocolServer : AppServer { public TerminatorProtocolServer() : base(new TerminatorReceiveFilterFactory("##")) { } }
默认RequestInfo类是StringRequestInfo,你也可以创建自己的RequestInfo类,但它需要多一点的工作:
基于TerminatorReceiveFilter实现你的ReceiveFilter:
public class YourReceiveFilter : TerminatorReceiveFilter<YourRequestInfo> { //More code }
实现你的ReceiveFilterFactory它可以创建您的请求过滤器实例:
public class YourReceiveFilterFactory : IReceiveFilterFactory<YourRequestInfo> { //More code }
然后你的应用服务器上使用请求过滤器工厂。
固定数字通过分离协议拆分成多个部分
有些协议定义了他们的请求格式看起来像“#第1部分#第2部分#第3部分#第4部分#第5部分#第6部分#第7部分#”. 有一个请求通过分隔字符'#'分成7个部分,这种协议的实现也很简单:
/// <summary> /// 你的协议看起来像下面的格式: /// #part1#part2#part3#part4#part5#part6#part7# /// </summary> public class CountSpliterAppServer : AppServer { public CountSpliterAppServer() : base(new CountSpliterReceiveFilterFactory((byte)'#', 8)) // 7个部分,但有8个分隔符 { } }
您还可以使用下面的类更深层的自定义协议:
CountSpliterReceiveFilter<TRequestInfo> CountSpliterReceiveFilterFactory<TReceiveFilter> CountSpliterReceiveFilterFactory<TReceiveFilter, TRequestInfo>
固定帧头和内容长度协议
这种协议定义了每个请求都有两部分, 第一部分包含该请求的一些基本信息还包括第二部分的长度. 我们通常所说的第一部分是header,第二部分是body.
例如,我们有一个类似的协议: header包含6个字节,前4个字节表示请求的名称, 后2个字节表示body的长度:
/// +-------+---+-------------------------------+
/// |request| l | |
/// | name | e | request body |
/// | (4) | n | |
/// | |(2)| |
/// +-------+---+-------------------------------+
使用SuperSocket,你可以轻松地实现这种协议:
class MyReceiveFilter : FixedHeaderReceiveFilter<BinaryRequestInfo> { public MyReceiveFilter() : base(6) { } protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length) { return (int)header[offset + 4] * 256 + (int)header[offset + 5]; } protected override BinaryRequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length) { return new BinaryRequestInfo(Encoding.UTF8.GetString(header.Array, header.Offset, 4), bodyBuffer.CloneRange(offset, length)); } }
你需要在FixedHeaderReceiveFilter的基础上实现自己的请求过滤器 .
- 传递到父类的构造函数的数字6表示着请求的header的长度;
- 方法“GetBodyLengthFromHeader(...)”你应该根据接收到的header重写返回body的长度;
- 的方法的“ResolveRequestInfo(......)”你应该根据接收到的header和body重写返回RequestInfo实例.
然后,你可以建立一个接收过滤器工厂或使用默认的接收工厂(SuperSocket接收滤波器).
最后编辑于2011年11月13,2012在2:16 PM,kerryjiang 版本3