コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }