本文在.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進程無法正常退出。