在WPF中集成SuperSocket 2.0
本文在.Net5环境下,在WPF项目中集成SuperSocket(V2.0.0-beta.10),以便使WPF程序拥有Socket服务器能力。
本文假设读者具有在.Net5控制台程序中使用SuperSocket 2.0的能力,因此服务器相关设置不再介绍。
1、创建托管服务器主机
参考在.Net5控制台程序中使用SuperSocket 2.0,将其创建主机的代码复制过来即可。
public interface ISocketServerService { void Startup(); void Shutdown(); } public class SocketServerService : ISocketServerService { private readonly IHost _host; private readonly ILogService _logService; public SocketServerService(ILogService logService) { _logService = logService; //创建宿主:用Package类型和PipelineFilter类型创建SuperSocket宿主。 _host = SuperSocketHostBuilder.Create<MyPackageInfo, MyPipelineFilter>() //注入Service .UseHostedService<MyService<MyPackageInfo>>() //注入Session .UseSession<MySession>() //注入命令 .UseCommand((commandOptions) => { commandOptions.AddCommand<MyCommand>(); //数据命令 }) //启用Session容器 .UseInProcSessionContainer() //配置日志 .ConfigureLogging((hostCtx, loggingBuilder) => { loggingBuilder.SetMinimumLevel(LogLevel.Warning); }) .Build(); } public void Startup() { try { _host.StartAsync().GetAwaiter(); } catch (Exception e) { _logService.Error($"启动SocketServer失败:{e.Message}."); } } public void Shutdown() { try { _host.StopAsync().GetAwaiter().GetResult(); } catch (Exception e) { _logService.Error($"关闭SocketServer失败:{e.Message}."); } finally { _host.Dispose(); } } }
2、添加配置文件appsettings.json
注意将其属性设置为:“生成操作”-“无”,“复制到输出目录”-“如果较新则复制”/”始终复制”。
下面的配置仅添加了IP和端口的参数作为示例。
{ "serverOptions": { "name": "MyServer", "listeners": [ { "ip": "Any", "port": "2021" } ] } }
3、使用方法
ISocketServerService socketServerService = new SocketServerService(logService); //启动Socket服务器 socketServerService.Startup(); //关闭Socket服务器 socketServerService.Shutdown();
4、注意事项
关闭Socket服务器时,如果不对IHost对象调用Dispose方法,SuperSocket不会真正关闭,导致WPF进程无法正常退出。