Fork me on GitHub

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(......)”你应该根据接收到的headerbody重写返回RequestInfo实例.

然后,你可以建立一个接收过滤器工厂或使用默认的接收工厂(SuperSocket接收滤波器).

最后编辑于2011年11月13,2012在2:16 PM,kerryjiang 版本3

posted @ 2013-03-13 22:20  逗豆豆  阅读(905)  评论(0编辑  收藏  举报