SuperSocket在.Net5中使用——概念篇

18 篇文章 3 订阅

背景:最近有一个通讯电文的项目,想着在.net core中使用SuperSocket来实现,但是发现使用上还是和在.NetFramework有一些不一样,然后对SuperSocket中一些使用方法也不是很熟悉,借此机会重新学习一下

附官网地址:SuperSocket 2.0 DocumentationSuperSocket is a light weight, cross platform and extensible socket server application framework. You can use it to build a server side socket application (like game server, GPS server, industrial control system, data acquisition server etc) easily without thinking about how to use socket, how to maintain the socket connections and how socket works., v2.0https://docs.supersocket.net/v2-0/en-US

1.使用SuperSocket目的、好处:

(1)封装Socket连接,开发者不用关心和编写过多的代码在Socket连接断开、创建多个Server等通用模块上、良好的对于Socket的配置

(2)更好管理客户端连接(AppSession)

(3)内置命令行协议(内置命令行管道过滤器

(4)内置的 PipelineFilter 模板 

(5)命令Command和命令过滤器CommandFilterAttribute、全局命令过滤器

(6)WebSocket服务器快捷搭建

(7)支持启用传输层安全TLS

(8)与 ASP.Net Core 网站集成,和网站同时运行在一个程序中

2.一些基本概念:

Package Type:包类型,其实就是传输数据对应的数据结构,你可以按照自己的程序电文协议选择相应的包类型来接受数据,内置的包类型有:TextPackageInfo、StringPackageInfo;

TextPackageInfo就是普通的文本结构:

 StringPackageInfo是简单的包括键值和body的数据结构,一些内置Filter默认将过滤好的数据解析为StringPackageInfo类。StringPackageInfo类使用了一个空格来分割请求key和参数。当客户端向服务器发送数据

"ADD user1 123456\r\n"

接收到的数据是:

Key: "ADD"

Body: "user1 123456";

Parameters: ["user1", "123456"]

 

PipelineFilter Type:管道过滤器类型,这种类型在网络协议解码中起着重要的作用。它定义了我们如何将 IO 流解码为应用程序可以理解的包。IPipelineFilter是PipelineFilter 的基本接口,自定义过滤器时需要实现它。SuperSocket2.0内置的过滤器类型有:

TerminatorPipelineFilter 终止符过滤器(过滤解析指定终止符之前的数据,默认解析成StringPackageInfo类)

 

TerminatorTextPipelineFilter 终止符文本管道过滤器(过滤解析指定终止符之前的数据,默认解析成TextPackageInfo类)

 

LinePipelineFilter 管路过滤器(最普通的过滤器,除了命令行限制,其他无限制,默认解析成TextPackageInfo类)

CommandLinePipelineFilter 命令行管道过滤器(最普通的过滤器,除了命令行限制,其他无限制,默认解析成StringPackageInfo类) 

BeginEndMarkPipelineFilter 有固定开始结束标记管道过滤器(根据开始和结束符过滤有效数据,默认解析成StringPackageInfo类)

FixedSizePipelineFilter 固定长度过滤器(只解析指定长度的数据,当数据长度小于指定长度时,会报错并断开连接重连,默认解析成StringPackageInfo类)

 

FixedHeaderPipelineFilter 固定开头(长度)管道过滤器(通过指定数据包开头长度,重写GetBodyLengthFromHeader方法,从开头数据包中获取有效数据包的长度,默认解析成StringPackageInfo类)

 

说实话,现在在实际项目中还没有用到这些过滤器,因为用在这些过滤器意味着电文必须符合命令好协议,以\r\n结尾,但是实际中的应用程序协议大多对接的对方都不改动,所以只有自定义过滤器了。当然这些内置的过滤器还是基本能满足大多的协议本身(如果不强制命令行协议就好了....)

想要详细了解这些过滤器的作用和实现过程,可以查看SuperSocket.ProtoBase.dll源代码

AppSession:代表一个逻辑套接字连接,即一个完整的连接;可以通过继承AppSession类,重写连接和断开方法来实现你的逻辑

public class MySession : AppSession
{
    protected override async ValueTask OnSessionConnectedAsync()
    {
        // do something right after the sesssion is connected
    }            

    protected override async ValueTask OnSessionClosedAsync(EventArgs e)
    {
        // do something right after the sesssion is closed
    }
}

SuperSocketService:服务实例,监听并管理客户端的连接,可以在其中定义应用程序级别的操作和逻辑。可以通过扩展 SuperSocketService 并覆盖方法

public class MySuperSocketService<TReceivePackageInfo> : SuperSocketService<TReceivePackageInfo>
    where TReceivePackageInfo : class
{
    public MySuperSocketService(IServiceProvider serviceProvider, IOptions<ServerOptions> serverOptions)
        : base(serviceProvider, serverOptions)
    {

    }

    protected override async ValueTask OnSessionConnectedAsync(IAppSession session)
    {
        // do something right after the sesssion is connected
        await base.OnSessionConnectedAsync(session);
    }

    protected override async ValueTask OnSessionClosedAsync(IAppSession session)
    {
        // do something right after the sesssion is closed
        await base.OnSessionClosedAsync(session);
    }

    protected override async ValueTask OnStartedAsync()
    {
        // do something right after the service is started
    }

    protected override async ValueTask OnStopAsync()
    {
        // do something right after the service is stopped
    }
}

Command:命令处理,是为了处理来自客户端的请求。

3.配置文件

SuperSocket 也使用 JSON 配置文件 appsettings.json;

新增serverOptions节点,示例:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "serverOptions": {
    "name": "TestServer",
    "listeners": [
      {
        "ip": "Any",
        "port": "2020"
      },
      {
        "ip": "Any",
        "port": "2021"
      }
    ]
  }
}

可配置的节点变量,参照官网:

  • name:服务器的名称;
  • maxPackageLength:服务器中允许的最大包大小;默认4M;
  • receiveBufferSize:接收缓冲区的大小;默认 4k​​;
  • sendBufferSize:发送缓冲区的大小;默认 4k​​;
  • receiveTimeout:接收超时;以毫秒为单位;
  • sendTimeout:发送超时;以毫秒为单位;
  • listeners:此服务器的侦听器端点;
  • listeners/*/ip:监听器的监听IP;Any:任何ipv4 ip地址,IPv6Any:任何ipv6 ip地址,其他实际IP地址;
  • listeners/*/port:监听器的监听端口;
  • listeners/*/backLog:挂起连接队列的最大长度;
  • listeners/*/noDelay:指定流Socket是否使用Nagle算法;
  • 监听器/*/安全:无/Ssl3/Tls11/Tls12/Tls13;通信使用的 TLS 协议版本;
  • listeners/*/certificateOptions:用于TLS加密/解密的证书选项;

以上是基本概念,后面的文章介绍怎么启动和使用

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值