Exemple #1
0
        public WebSocketSession(WebSocket webSocket, IMessageParser messageParser, ILogger <WebSocketSession> logger)
        {
            if (webSocket is null)
            {
                throw new ArgumentNullException(nameof(webSocket));
            }

            if (messageParser is null)
            {
                throw new ArgumentNullException(nameof(messageParser));
            }

            if (logger is null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            _incomingMessagesProcessor = new Thread(() =>
            {
                try
                {
                    var received  = new List <byte[]>(4);
                    byte[] buffer = new byte[1024 * 4];
                    while (!_isDisposed && !webSocket.CloseStatus.HasValue && webSocket.State == WebSocketState.Open)
                    {
                        var result = webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None)
                                     .GetAwaiter()
                                     .GetResult();
                        received.Add(buffer[0..result.Count]);
                        if (result.EndOfMessage)
                        {
                            var messageRaw = Encoding.UTF8.GetString(received.SelectMany(x => x).ToArray());
                            var message    = messageParser.DeserializeClientMessage(messageRaw);
                            if (!_receivedMessagesSubject.IsDisposed)
                            {
                                _receivedMessagesSubject.OnNext(message);
                            }
                            received.Clear();
                        }
                        Array.Clear(buffer, 0, buffer.Length);
                    }