private void SendToAllSubscribers <T>(WebSocketJsonType type, T data) { var wsToRemove = new List <WebSocket>(); var segment = ConvertToBytesWithType(type, data); lock (_webSockets) { foreach (var ws in _webSockets) { if (ws.Value.Second.IsCompleted) { if (_users.TryGetValue(ws.Value.First, out var user)) { user.Online = false; } wsToRemove.Add(ws.Key); } else { ws.Key.SendAsync(segment, WebSocketMessageType.Binary, false, CancellationToken.None).Wait(); } } foreach (var ws in wsToRemove) { _webSockets.Remove(ws); } } }
private static ArraySegment <byte> ConvertToBytesWithType <T>(WebSocketJsonType type, T data) { var responseStr = JsonConvert.SerializeObject(data); var buffer = Encoding.UTF8.GetBytes(responseStr); var buffWithType = new byte[buffer.Length + 1]; buffWithType[0] = (byte)type; Buffer.BlockCopy(buffer, 0, buffWithType, 1, buffer.Length); return(new ArraySegment <byte>(buffWithType)); }