zoukankan      html  css  js  c++  java
  • SuperSocket 2.0学习02:通过配置启动 SuperSocket

    官方学习资料:通过配置启动 SuperSocket

    本文开发环境:Win10 + VS2019 + .NetCore 3.1 + SuperSocket 2.0.0-beta.8。

    Gitee:SuperSocketV2Sample

    1、创建项目

    使用VS2019创建.NET Core控制台程序,选择.Net Core 3.1,通过NuGet引入SuperSocket(2.0.0-beta.8)。 

    2、添加配置文件

    在项目根目录添加appsettings.json配置文件,并设置其文件属性为“如果较新则复制”。

    {
      "serverOptions": {
        "name": "GameMsgServer",
        "listeners": [
          {
            "ip": "Any",
            "port": "2020"
          },
          {
            "ip": "127.0.0.1",
            "port": "2021"
          }
        ]
      }
    }
    
    //配置项目
    //name: 服务器的名称;
    //maxPackageLength: 此服务器允许的最大的包的大小; 默认4M;
    //receiveBufferSize: 接收缓冲区的大小; 默认4k;
    //sendBufferSize: 发送缓冲区的大小; 默认4k;
    //receiveTimeout: 接收超时时间; 微秒为单位;
    //sendTimeout: 发送超时的事件; 微秒为单位;
    //listeners: 服务器的监听器;
    //listeners/*/ip: 监听IP; Any: 所有 ipv4 地址, IPv6Any: 所有 ipv6 地址, 其它具体的IP地址;
    //listeners/*/port: 监听端口;
    //listeners/*/backLog: 连接等待队列的最大长度;
    //listeners/*/noDelay: 定义 Socket 是否启用 Nagle 算法;
    //listeners/*/security: None/Ssl3/Tls11/Tls12/Tls13; 传输层加密所使用的TLS协议版本号;
    //listeners/*/certificateOptions: 用于TLS加密/揭秘的证书的配置项目;

    3、测试代码

    using System;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    using SuperSocket;
    using SuperSocket.ProtoBase;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace SuperSocketV2Sample.Config
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                //创建宿主:用Package的类型和PipelineFilter的类型创建SuperSocket宿主。
                var host = SuperSocketHostBuilder.Create<StringPackageInfo, CommandLinePipelineFilter>()
                    //注册用于处理连接、关闭的Session处理器
                    .UseSessionHandler(async (session) =>
                    {
                        Console.WriteLine($"session connected: {session.RemoteEndPoint}");
    
                        //发送消息给客户端
                        var msg = $@"Welcome to TelnetServer: {session.RemoteEndPoint}";
                        await session.SendAsync(Encoding.UTF8.GetBytes(msg + "
    "));
                    }, async (session, reason) =>
                    {
                        Console.WriteLine($"session {session.RemoteEndPoint} closed: {reason}");
                    })
                    //注册用于处理接收到的数据的包处理器
                    .UsePackageHandler(async (session, package) =>
                    {
                        Console.WriteLine($"session ip: {session.RemoteEndPoint}, " +
                                          $" command: {package.Key}");
    
                        string result;
                        try
                        {
                            switch (package.Key.ToUpper())
                            {
                                case "ECHO":
                                    result = package.Body;
                                    break;
    
                                case ("ADD"):
                                    result = package.Parameters
                                        .Select(t => int.Parse(t))
                                        .Sum()
                                        .ToString();
                                    break;
    
                                case ("SUB"):
                                    result = package.Parameters
                                        .Select(t => int.Parse(t))
                                        .Aggregate((x, y) => x - y)
                                        .ToString();
                                    break;
    
                                case ("MULT"):
                                    result = package.Parameters
                                        .Select(t => int.Parse(t))
                                        .Aggregate((x, y) => x * y)
                                        .ToString();
                                    break;
    
                                default:
                                    result = "Unknown command";
                                    break;
                            }
                        }
                        catch (Exception e)
                        {
                            result = e.Message;
                        }
    
                        //发送消息给客户端
                        await session.SendAsync(Encoding.UTF8.GetBytes(result + "
    "));
                    })
                    //配置日志
                    .ConfigureLogging((hostCtx, loggingBuilder) =>
                    {
                        loggingBuilder.AddConsole();
                    })
                    .Build();
                await host.RunAsync();
            }
        }
    }
  • 相关阅读:
    Jzoj5542 董先生的钦点
    Jzoj5542 董先生的钦点
    (各种)FFT模板
    (各种)FFT模板
    Jzoj3528 图书馆
    Jzoj3528 图书馆
    Jzoj5317 Func
    Jzoj5317 Func
    Jzoj3591 数据
    【UVa11021】Tribles
  • 原文地址:https://www.cnblogs.com/xhubobo/p/14609687.html
Copyright © 2011-2022 走看看