官方學習資料:通過配置啟動 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(); } } }