Пример #1
0
        private async Task InternalReceiveAsync()
        {
            var buffer = new byte[SocketsConstants.ChunkSize];
            var result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

            while (!result.CloseStatus.HasValue)
            {
                if (result.MessageType == WebSocketMessageType.Text)
                {
                    try
                    {
                        var context = result.ToContext(buffer);
                        if (context.Command == WebSocketCommands.Handshake)
                        {
                            _context.ConnectionId = context.Value?.ToString();
                            _handshakeCallback?.Invoke(_context.ConnectionId);
                        }

                        var invocator = _context.GetInvocator(_serviceProvider);
                        invocator?.InvokeAsync(context);
                    }
                    catch (Exception ex)
                    {
                        LogHelper.Log(_context, "Error", ex);
                    }
                    result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);
                }

                if (result.MessageType == WebSocketMessageType.Binary)
                {
                    byte[] binaryResult = null;
                    using (var ms = new MemoryStream())
                    {
                        while (!result.EndOfMessage)
                        {
                            if (!result.CloseStatus.HasValue)
                            {
                                await ms.WriteAsync(buffer, 0, result.Count);
                            }
                            result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);
                        }
                        if (result.EndOfMessage)
                        {
                            if (!result.CloseStatus.HasValue)
                            {
                                await ms.WriteAsync(buffer, 0, result.Count);
                            }
                        }
                        binaryResult = ms.ToArray();
                    }
                    try
                    {
                        var context = await result.ToBinaryContextAsync(_context.Compressor, binaryResult);

                        var invocator = _context.GetInvocator(_serviceProvider);
                        invocator?.InvokeAsync(context);
                    }
                    catch (Exception ex)
                    {
                        LogHelper.Log(_context, "Error", ex);
                    }
                    result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);
                }
            }
            await _context.WebSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);

            _closeCallback.Invoke(_context);
        }
Пример #2
0
        public async Task ReceiveAsync(CancellationToken cancellationToken)
        {
            var buffer = new byte[NCSConstants.ChunkSize];
            var result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken);

            while (!result.CloseStatus.HasValue)
            {
                if (result.MessageType == WebSocketMessageType.Text)
                {
                    byte[] inputs = null;
                    using (var ms = new MemoryStream())
                    {
                        while (!result.EndOfMessage)
                        {
                            await ms.WriteAsync(buffer, 0, result.Count);

                            result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken);
                        }

                        await ms.WriteAsync(buffer, 0, result.Count);

                        inputs = ms.ToArray();
                    }
                    try
                    {
                        var context   = result.ToContext(inputs);
                        var invocator = _context.GetInvocator(_serviceProvider);
                        if (invocator != null)
                        {
                            await invocator.InvokeAsync(context);
                        }
                    }
                    catch (Exception ex)
                    {
                        LogHelper.Log(_context, "Error", ex);
                    }
                    result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken);
                }

                if (result.MessageType == WebSocketMessageType.Binary)
                {
                    byte[] binaryResult = null;
                    using (var ms = new MemoryStream())
                    {
                        while (!result.EndOfMessage)
                        {
                            await ms.WriteAsync(buffer, 0, result.Count);

                            result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken);
                        }

                        await ms.WriteAsync(buffer, 0, result.Count);

                        binaryResult = ms.ToArray();
                    }
                    try
                    {
                        var context = await result.ToBinaryContextAsync(_context.Compressor, binaryResult);

                        var invocator = _context.GetInvocator(_serviceProvider);
                        if (invocator != null)
                        {
                            await invocator.InvokeAsync(context);
                        }
                    }
                    catch (Exception ex)
                    {
                        LogHelper.Log(_context, "Error", ex);
                    }
                    result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken);
                }
            }

            await _context.WebSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, cancellationToken);

            _logger.LogInformation("WebSocketReceiver[Server] {0} has close status for connection: {1}", result.CloseStatus, _context.ConnectionId);
            _closeCallback?.Invoke(_context);
        }