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 + "\r\n"));
                }, 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 + "\r\n"));
                })
                //配置日志
                .ConfigureLogging((hostCtx, loggingBuilder) =>
                {
                    loggingBuilder.AddConsole();
                })
                .Build();
            await host.RunAsync();
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM