使用SuperSocket做WebSocket服務器開發需要引用包SuperSocket.WebSocket.Server,本文簡稱SuperWebScoket。
本文環境為.Net5 + ASP.Net Core Web API + SuperSocket.WebSocket.Server 2.0.0-beta.10,介紹了如何在在.NetCore WebAPI中使用SuperWebScoket的方法,以及如何啟動WebSocket。
本文假設讀者具有.NetCore Web API及SuperWebScoket的使用經驗。
1、創建自定義WebScoket服務
WebScoket服務主要對WebScoket的配置進行設置,使用了內存配置代替傳統的配置文件,通過在WebAPI項目中設置WebScoket端口,實現了端口的動態配置。
此外,參考《在WPF中集成SuperSocket 2.0》,WebScoket服務也在關閉IHost時執行了Dispose方法。不過,作為服務端程序,WebScoket服務一般不會關閉,直到所在的進程退出。
public interface IWebSocketServerService { Task Startup(); Task Shutdown(); } public class WebSocketServerService : IWebSocketServerService { private IHost _host; private readonly ILogger<WebSocketServerService> _logger; private readonly int _port; public WebSocketServerService(ILogger<WebSocketServerService> logger, IConfiguration configuration) { _logger = logger; var port = configuration["WebSocketServer:Port"]; if (!int.TryParse(port, out _port)) { _port = 6666; _logger.LogWarning($"讀取WebSocketServerPort失敗,默認監聽端口{_port}."); } } public async Task Startup() { try { _host = WebSocketHostBuilder.Create() //注冊WebSocket消息處理器 .UseWebSocketMessageHandler(async (session, package) => { Console.WriteLine($@"{DateTime.Now:yyyy-MM-dd HH:mm:ss fff} Receive message: {package.Message}."); //Send message back var message = $@"{DateTime.Now:yyyy-MM-dd HH:mm:ss fff} Hello from WebSocket Server: {package.Message}."; await session.SendAsync(message); }) .ConfigureAppConfiguration((hostCtx, configApp) => { configApp.AddInMemoryCollection(new Dictionary<string, string> { {"serverOptions:name", "NwMesServer"}, {"serverOptions:listeners:0:ip", "Any"}, {"serverOptions:listeners:0:port", $"{_port}"} }); }) .ConfigureLogging((hostCtx, loggingBuilder) => { //添加控制台輸出 loggingBuilder.AddConsole(); }) .Build(); await _host.RunAsync(); } catch (Exception e) { _logger.LogError($"啟動WebSocketServer失敗:{e.GetMessageWithInnerException()}."); } } public async Task Shutdown() { try { await _host.StopAsync(); } catch (Exception e) { _logger.LogError($"關閉WebSocketServer失敗:{e.Message}."); } finally { _host.Dispose(); } } }
2、注冊WebScoket服務
在Startup.cs的ConfigureServices方法中注入即可。
public void ConfigureServices(IServiceCollection services) { //注入服務 services.AddScoped<IMd5Service, Md5Service>(); services.AddSingleton<IWebSocketServerService, WebSocketServerService>(); }
3、啟動WebSocket服務
在Startup.cs的Configure方法中啟動WebScoket服務。
public async void Configure(IApplicationBuilder app, IWebHostEnvironment env) { ... app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); //啟動WebSocket服務 var webSocketServerService = app.ApplicationServices.GetService<IWebSocketServerService>(); await webSocketServerService.Startup(); }
