private void ReadCallback(IAsyncResult ar)
        {
            var readBytes = _server.EndRead(ar);

            if (readBytes > 0)
            {
                var message = (Message)ar.AsyncState;
                OnClientMessage?.Invoke(message.Buffer);
            }

            OnDisconnected();
        }
Пример #2
0
        public async Task SocketClientLoop(Guid clientId)
        {
            using var bufferStream = new MemoryStream(4096);
            using var readStream   = new StreamReader(bufferStream, Encoding.UTF8);
            var buffer = new byte[4096];
            var data   = string.Empty;

            do
            {
                try
                {
                    if (!_connectedClients.TryGetValue(clientId, out var socket))
                    {
                        break;
                    }
                    if (socket.State == WebSocketState.Closed || socket.State == WebSocketState.Aborted)
                    {
                        _connectedClients.TryRemove(clientId, out _);
                        break;
                    }

                    WebSocketReceiveResult receiveResult = await socket.ReceiveAsync(buffer, _cancelToken);

                    if (receiveResult.MessageType == WebSocketMessageType.Close)
                    {
                        await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", _cancelToken);

                        _connectedClients.TryRemove(clientId, out _);
                        break;
                    }

                    bufferStream.Seek(0, SeekOrigin.Begin);
                    var totalRead = 0;
                    if (!receiveResult.EndOfMessage)
                    {
                        do
                        {
                            receiveResult = await socket.ReceiveAsync(buffer, _cancelToken);

                            totalRead += receiveResult.Count;
                            await bufferStream.WriteAsync(buffer, 0, receiveResult.Count);
                        }while (receiveResult.EndOfMessage);
                    }
                    else
                    {
                        totalRead += receiveResult.Count;
                        await bufferStream.WriteAsync(buffer, 0, receiveResult.Count);
                    }

                    bufferStream.Seek(0, SeekOrigin.Begin);
                    //Since the memory stream is reused trim it to the actual length of bytes read.
                    bufferStream.SetLength(totalRead);
                    data = await readStream.ReadToEndAsync();

                    if (!data.StartsWith("{"))
                    {
                        await socket.CloseAsync(WebSocketCloseStatus.InvalidPayloadData, "", _cancelToken);

                        try
                        {
                            socket.Dispose();
                        }
                        catch { }
                        _connectedClients.TryRemove(clientId, out _);
                        break;
                    }

                    var model      = JsonSerializer.Deserialize <ClientMessage>(data, DefaultJsonOptions.JsonOptions);
                    var invokeList = new List <Task>();
                    var eventArgs  = new SocketMessageEventArgs()
                    {
                        ClientId = clientId,
                        Message  = model
                    };
                    foreach (var i in OnClientMessage.GetInvocationList())
                    {
                        invokeList.Add(((OnClientMessageEventHandler)i)(this, eventArgs));
                    }
                    await Task.WhenAll(invokeList);
                }
                catch (Exception ex)
                {
                    _ = Task.Run(() => { _logger?.WriteLog(ex.ToString()); });
                }

                await Task.Delay(5);
            } while (!_cancelToken.IsCancellationRequested);
        }
Пример #3
0
 public void OnIncomingClientMessage(ServerRouterSession client, RouterMessage msg)
 {
     OnClientMessage?.Invoke((T)client, msg);
 }