1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| public class WebSocketService { private static ConcurrentDictionary<string, WebSocket> sessionMap = new ConcurrentDictionary<string, WebSocket>();
public async Task OnOpen(WebSocket webSocket, string sid) { Console.WriteLine($"客户端:{sid} 建立连接"); sessionMap.TryAdd(sid, webSocket); }
public async Task OnMessage(WebSocket webSocket, string message, string sid) { Console.WriteLine($"收到来自客户端:{sid} 的信息: {message}"); }
public void OnClose(string sid) { if (sessionMap.TryRemove(sid, out _)) { Console.WriteLine($"连接断开: {sid}"); } }
public async Task SendToAllClients(string message) { var buffer = Encoding.UTF8.GetBytes(message); foreach (var webSocket in sessionMap.Values) { if (webSocket.State == WebSocketState.Open) { await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None); } } }
public async Task HandleWebSocketConnection(WebSocket webSocket, string sid, CancellationToken cancellationToken) { await OnOpen(webSocket, sid);
var buffer = new byte[1024 * 4]; while (webSocket.State == WebSocketState.Open) { var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cancellationToken); if (result.MessageType == WebSocketMessageType.Text) { var message = Encoding.UTF8.GetString(buffer, 0, result.Count); await OnMessage(webSocket, message, sid); } else if (result.MessageType == WebSocketMessageType.Close) { OnClose(sid); await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", cancellationToken); } } }
|