public async Task <Message> SendDirectWaitReponseAsync(string peer, byte[] payload) { var id = Guid.NewGuid().ToString(); var ack = RegisterAck(id); var res = RegisterResponse(id); _logger.Trace("Send DWR message with id {0}", id); await _client.SendAsync(new InternalMessage { CorrelationId = id, Payload = payload, Sender = Name, Reciever = peer, Type = InternalMessageType.Direct }); await ack.Timeout(_opts.Timeout, _cts.Token); var im = await res.Timeout(_opts.Timeout, _cts.Token); return(new Message { Type = (MessageType)im.Type, CorrelationId = im.CorrelationId, Payload = im.Payload, Reciever = im.Reciever, Sender = im.Sender }); }
private async Task SendAsync(InternalHubNetworkClient client, InternalMessage msg) { try { msg.Reciever = client.Name; _logger.Trace("[{0}] Send message from client {1} to client {2} with id {3} with type {4}", _networkName, msg.Sender, msg.Reciever, msg.CorrelationId, msg.Type); await client.SendAsync(msg); } catch (Exception) { _clients.TryRemove(client.Name, out var _); } }
private async Task Listen() { _server.Start(); while (!_cts.IsCancellationRequested) { try { var client = await _server.AcceptTcpClientAsync(); _logger.Info($"New connection from {client.Client.RemoteEndPoint}"); var clientSocket = new InternalHubNetworkClient("", "", new Client.TcpClient(client), new ClientSocketOptions { AutoReconnect = false, Heartbeat = false }, _clientLogger); clientSocket.SetConnected(); var m = await clientSocket.ReadAsync(); if (m.Type != InternalMessageType.Init) { throw new Exception($"Invalid init message from client {client.Client.RemoteEndPoint}"); } clientSocket.Name = m.Reciever; _logger.Info($"New connection {client.Client.RemoteEndPoint} identified as {clientSocket.Name}"); var networkName = Encoding.UTF8.GetString(m.Payload); var network = _networks.GetOrAdd(networkName, n => new Network(networkName)); clientSocket.OnMessage += async(s, msg) => { await _serveMessages.SendAsync(new NetworkMessage { Message = msg, Network = networkName, Socket = clientSocket }); }; clientSocket.StartRecieve(); try { if (network.AddClient(clientSocket)) { await clientSocket.SendAsync(new InternalMessage() { CorrelationId = m.CorrelationId }); } else { await clientSocket.SendAsync(new InternalMessage { Type = InternalMessageType.Error, CorrelationId = m.CorrelationId, Payload = Encoding.UTF8.GetBytes($"Client with name {clientSocket.Name} already connected") }); continue; } } catch (Exception) { continue; } } catch (Exception e) { _logger.Error(e, $"Error occured in listener thread"); } } }