public void Add(string key, IPAddress ip, WebSocket webSocket, TaskCompletionSource <WebSocket> socketTCS) { if (string.IsNullOrWhiteSpace(key) || webSocket is null) { socketTCS.TrySetCanceled(); return; } foreach (var item in _wsClients.Where(c => c.Value.Client.State == WebSocketState.Closed)) { _wsClients.Remove(item.Key, out WSNotifyData removedItem); removedItem.SocketTCS.TrySetResult(removedItem.Client); } key = key.Replace("+", "-").Replace("/", "_").Replace("=", ""); var data = new WSNotifyData(key, ip, webSocket, socketTCS); _wsClients[key] = data; BindReceiver(data); }
private async void BindReceiver(WSNotifyData data) { var buffer = new byte[4096]; WebSocketReceiveResult result = await data.Client.ReceiveAsync(buffer, data.ThreadCancellation.Token); while (!result.CloseStatus.HasValue) { using (MemoryStream ms = new MemoryStream()) { while (!result.EndOfMessage) { await ms.WriteAsync(buffer, 0, result.Count, data.ThreadCancellation.Token); result = await data.Client.ReceiveAsync(buffer, data.ThreadCancellation.Token); } await ms.WriteAsync(buffer, 0, result.Count, data.ThreadCancellation.Token); if (OnReceive != null) { if (result.MessageType == WebSocketMessageType.Binary) { OnReceive(data.Key, Convert.ToBase64String(ms.ToArray()), WSNotifyMessageType.Binary); } else { OnReceive(data.Key, Encoding.UTF8.GetString(ms.ToArray()), WSNotifyMessageType.Text); } } } result = await data.Client.ReceiveAsync(buffer, data.ThreadCancellation.Token); } RemoveAsync(data.Key); }