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(); } } }