コード例 #1
0
        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
            });
        }
コード例 #2
0
ファイル: Network.cs プロジェクト: TheCheshireFox/HubNetwork
        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 _);
            }
        }
コード例 #3
0
        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");
                }
            }
        }