private void ReadCallback(IAsyncResult ar) { var readBytes = _server.EndRead(ar); if (readBytes > 0) { var message = (Message)ar.AsyncState; OnClientMessage?.Invoke(message.Buffer); } OnDisconnected(); }
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); }
public void OnIncomingClientMessage(ServerRouterSession client, RouterMessage msg) { OnClientMessage?.Invoke((T)client, msg); }