Example #1
0
        public static async Task ReceiveAsync(this WebSocket ws, IWebSocketHandler handler)
        {
            try
            {
                while (ws.State == WebSocketState.Open)
                {
                    var stringResult = new StringBuilder();
                    WebSocketReceiveResult received;
                    var buffer    = new ArraySegment <byte>(new byte[ChunkSize]);
                    var webSocket = ws;
                    do
                    {
                        received = await ws.ReceiveAsync(buffer, CancellationToken.None);

                        switch (received.MessageType)
                        {
                        case WebSocketMessageType.Close:
                            await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);

                            await handler.OnDisconected(webSocket);

                            break;

                        case WebSocketMessageType.Binary:
                            break;

                        case WebSocketMessageType.Text:
                            var data = Encoding.Default.GetString(buffer.Array, buffer.Offset, buffer.Count);
                            stringResult.Append(data.TrimEnd('\0'));
                            break;

                        default:
                            throw new ArgumentOutOfRangeException($"Unknown WebSocket MessageType: {received.MessageType}");
                        }
                    } while (!received.EndOfMessage);

                    RunInTask(async() => await handler.OnMessage(webSocket, stringResult.ToString()));
                }
            }
            catch (Exception e)
            {
                await handler.OnError(e);

                await handler.OnDisconected(ws);
            }
            finally
            {
                ws.Dispose();
            }
        }