示例#1
0
            protected async Task ReadWebSocketForEvents(CancellationToken cancelToken, Action notifyConnectionBroken)
            {
                var buffer = new ArraySegment <byte>(new byte[8192]);
                var stream = new MemoryStream(8192);

                while (!cancelToken.IsCancellationRequested)
                {
                    stream.Seek(0, SeekOrigin.Begin);

                    WebSocketReceiveResult result = null;
                    do
                    {
                        try {
                            result = await webSocket.ReceiveAsync(buffer, cancelToken);
                        }
                        catch (Exception) {
                            var t = CloseSocket(); // no need to wait for completion
                            if (!cancelToken.IsCancellationRequested)
                            {
                                notifyConnectionBroken();
                            }
                            listener.OnConnectionClosed();
                            return;
                        }
                        stream.Write(buffer.Array, buffer.Offset, result.Count);
                    }while (!result.EndOfMessage);

                    stream.Seek(0, SeekOrigin.Begin);

                    if (result.MessageType == WebSocketMessageType.Text)
                    {
                        using (var reader = new StreamReader(stream, Encoding.UTF8, false, 1024, leaveOpen: true)) {
                            JObject eventObj = StdJson.JObjectFromReader(reader);
                            try {
                                DispatchEvent(eventObj);
                            }
                            catch (Exception exp) {
                                Exception exception = exp.GetBaseException() ?? exp;
                                Console.Error.WriteLine("Exception in event dispatch: " + exception.Message);
                            }
                        }
                    }
                    else if (result.MessageType == WebSocketMessageType.Close)
                    {
                        await CloseSocket();

                        if (!cancelToken.IsCancellationRequested)
                        {
                            notifyConnectionBroken();
                        }
                        listener.OnConnectionClosed();
                        return;
                    }
                }
            }