using System.Collections.Concurrent; using System.Net.WebSockets; using System.Text; using System.Threading.Tasks; using System.Threading; using System; using System.Collections.Generic; using System.Linq; namespace Syc.Basic.Web.WMS { // WebSocketManager.cs public class WebSocketManager { private readonly ConcurrentDictionary _sockets = new(); private static Lazy socketManager = new Lazy(() => new WebSocketManager()); public static WebSocketManager SocketManager => socketManager.Value; public void AddSocket(System.Net.WebSockets.WebSocket socket, string connectionId) { _sockets.TryAdd(connectionId, socket); } public async Task RemoveSocket(string connectionId) { if (_sockets.TryRemove(connectionId, out var socket)) { await socket.CloseAsync( WebSocketCloseStatus.NormalClosure, "Connection closed", CancellationToken.None); } } public async Task SendMessageAsync(string connectionId, string message) { if (_sockets.TryGetValue(connectionId, out var socket)) { var buffer = Encoding.UTF8.GetBytes(message); await socket.SendAsync( new ArraySegment(buffer), WebSocketMessageType.Text, true, CancellationToken.None); } } public async Task BroadcastAsync(string message) { List keys = new List(); foreach (var pair in _sockets) { if (pair.Value.State == WebSocketState.Open) { try { await SendMessageAsync(pair.Key, message); } catch (Exception ex) { keys.Add(pair.Key); } } } if (keys.Any()) { foreach (var item in keys) { _sockets.Remove(item,out _); } } } } }