SuperSocket 中的几个基本概念

Keywords: 基本概念

Package Type(包类型)

包类型代表从网络另一段收到的数据包的数据结构。

包类型 TextPackageInfo(SuperSocket.ProtoBase.TextPackageInfo,SuperSocket.ProtoBase) 是在 SuperSocket 中定义的最简单的数据包。它代表这类型的包仅包含一个字符串。

  1. public class TextPackageInfo
  2. {
  3. public string Text { get; set; }
  4. }

但是我们通常会有更复杂的网络数据包结构。例如,下面定义的包类型告诉我们此数据包包含两个字段,Sequence 和 Body。

  1. public class MyPackage
  2. {
  3. public short Sequence { get; set; }
  4. public string Body { get; set; }
  5. }

有的包会有一个特殊的字段来代表此包内容的类型。我们将此字段命名为 “Key”。此字段也告诉我们用何种逻辑处理此类型的包。这是在网络应用程序中非常常见的一种设计。例如,你的 Key 字段是整数类型,你的包类型需要实现接口 IKeyedPackageInfo:

  1. public class MyPackage : IKeyedPackageInfo<int>
  2. {
  3. public int Key { get; set; }
  4. public short Sequence { get; set; }
  5. public string Body { get; set; }
  6. }

在后面的文档中,我们会解析如何根据 Key 字段的值定义命令来处理不不同种类的数据包。

PipelineFilter Type

这种类型在网络协议解析中作用重要。它定义了如何将 IO 数据流解码成可以被应用程序理解的数据包。

这些是 PipelineFilter 的基本接口。你的系统中至少需要一个实现这个接口的 PipelineFilter 类型。

  1. public interface IPipelineFilter
  2. {
  3. void Reset();
  4. object Context { get; set; }
  5. }
  6. public interface IPipelineFilter<TPackageInfo> : IPipelineFilter
  7. where TPackageInfo : class
  8. {
  9. IPackageDecoder<TPackageInfo> Decoder { get; set; }
  10. TPackageInfo Filter(ref SequenceReader<byte> reader);
  11. IPipelineFilter<TPackageInfo> NextFilter { get; }
  12. }

事实上,由于 SuperSocket 已经提供了一些内置的 PipelineFilter 模版,这些几乎可以覆盖 90% 的场景的模版极大的简化了你的开发工作。所以你不需要完全从头开始实现 PipelineFilter。即使这些内置的模版无法满足你的需求,完全自己实现PipelineFilter也不是难事。

CommandLinePipelineFilter (SuperSocket.ProtoBase.CommandLinePipelineFilter, SuperSocket.ProtoBase) 是在我们最常用的内置PipleFilter模版之一。我们将会在文档和示例代码中经常使用它。

使用 Package Type 和 PipelineFilter Type 创建 SuperSocket 宿主

你定义好 Package 类型和 PipelineFilter 类型之后,你就可以使用 SuperSocketHostBuilder 创建 SuperSocket 宿主了。

  1. var host = SuperSocketHostBuilder.Create<StringPackageInfo, CommandLinePipelineFilter>();

在某些情况下,你可能需要实现接口 IPipelineFilterFactory 来完全控制 PipelineFilter 的创建。

  1. public class MyFilterFactory : PipelineFilterFactoryBase<TextPackageInfo>
  2. {
  3. protected override IPipelineFilter<TPackageInfo> CreateCore(object client)
  4. {
  5. return new FixedSizePipelineFilter(10);
  6. }
  7. }

然后在 SuperSocket 宿主被创建出来之后启用这个 PipelineFilterFactory:

  1. var host = SuperSocketHostBuilder.Create<StringPackageInfo>();
  2. host.UsePipelineFilterFactory<MyFilterFactory>();