实现你的 PipelineFilter

    阅读了前面一篇文档之后, 你可能会觉得用 SuperSocket 来实现你的自定义协议并不简单。但事实上,由于 SuperSocket 已经提供了一些内置的 PipelineFilter 模版,这些几乎可以覆盖 90% 的场景的模版极大的简化了你的开发工作。所以你不需要完全从头开始实现 PipelineFilter。即使这些内置的模版无法满足你的需求,完全自己实现PipelineFilter也不是难事

    SuperSocket 提供了这些 PipelineFilter 模版:

    • TerminatorPipelineFilter (SuperSocket.ProtoBase.TerminatorPipelineFilter, SuperSocket.ProtoBase)
    • TerminatorTextPipelineFilter (SuperSocket.ProtoBase.TerminatorTextPipelineFilter, SuperSocket.ProtoBase)
    • LinePipelineFilter (SuperSocket.ProtoBase.LinePipelineFilter, SuperSocket.ProtoBase)
    • CommandLinePipelineFilter (SuperSocket.ProtoBase.CommandLinePipelineFilter, SuperSocket.ProtoBase)
    • FixedSizePipelineFilter (SuperSocket.ProtoBase.FixedSizePipelineFilter, SuperSocket.ProtoBase)
    • FixedHeaderPipelineFilter (SuperSocket.ProtoBase.FixedHeaderPipelineFilter, SuperSocket.ProtoBase)

    如何基于内置模版实现 PipelineFilter

    这种协议将一个请求定义为两大部分, 第一部分定义了包含第二部分长度等等基础信息. 我们通常称第一部分为头部.

    例如, 我们有一个这样的协议: 头部包含 3 个字节, 第 1 个字节用于存储请求的类型, 后两个字节用于代表请求体的长度:

    1. {
    2. public byte Key { get; set; }
    3. }

    下一个是设计PipelineFilter:

    最后,你可通过数据包的类型和 PipelineFilter 的类型来创建宿主:

    1. var host = SuperSocketHostBuilder.Create<MyPackage, MyPipelineFilter>()
    2. .UsePackageHandler(async (s, p) =>
    3. // handle your package over here
    4. }).Build();

    通过 host builder 的 UsePackageDecoder 方法来在SuperSocket中启用它: