Beispiel #1
0
        public async Task Listen()
        {
            try
            {
                var request = await Client.ReceiveAsync();
                var requestMessage = Messaging.ReceiveMessage(request.Buffer);
                if (requestMessage.MessageId != PreviousMessageIdReceived)
                {
                    UniqueMessagesReceived++;
                    PreviousMessageIdReceived = requestMessage.MessageId;
                }
                BytesUsed += request.Buffer.Length;
                Terminal.Log($"Bytes Used: {BytesUsed}B {KilobytesUsed}KB {MegabytesUsed}MB  ", 0, true);
                Terminal.Log($"{KilobytesPerSecond} KB/s  ", 0, ConsoleColor.Cyan);
                Terminal.Log($"Recv: {UniqueMessagesReceived}  ", 0, ConsoleColor.Green);
                Terminal.Log($"Avg: {AverageMessageSize}KB        ", 0, ConsoleColor.Magenta);

                switch (requestMessage.Type)
                {
                    case MessageType.Connect:
                        var connectionMessage = new ConnectMessage(requestMessage.Payload);
                        var connection = new Connection(request.RemoteEndPoint, requestMessage.ConnectionId,
                            requestMessage.Channel, connectionMessage.ScreenWidth, connectionMessage.ScreenHeight);
                        if (Connections.Any(cr => cr.Id.Equals(connection.Id)))
                        {
                            Connections.Remove(Connections.First(cr => cr.Id.Equals(connection.Id)));
                        }
                        Connections.Add(connection);
                        Terminal.LogLine($"Channel {connection.Channel} received connection from client {connection.Id} ({connection.IpEndPoint})", ConsoleColor.DarkGreen);
                        var channelConnections = Connections.Where(cr => cr.Channel.Equals(connection.Channel)).ToArray();
                        if (channelConnections.Count() == 2)
                        {
                            await SendAcknowledgement(channelConnections.ElementAt(0), channelConnections.ElementAt(1));
                        }
                        break;
                    case MessageType.Disconnect:
                        Connections.RemoveAll(cr => cr.Id.Equals(requestMessage.ConnectionId));
                        Terminal.LogLine($"Client {requestMessage.ConnectionId} disconnected from channel {requestMessage.Channel}", ConsoleColor.Yellow);
                        await SendMessage(requestMessage);
                        break;
                    case MessageType.Terminate:
                        Connections.RemoveAll(cr => cr.Id.Equals(requestMessage.ConnectionId));
                        Terminal.LogLine($"Client {requestMessage.ConnectionId} terminated connection from channel {requestMessage.Channel}", ConsoleColor.Magenta);
                        await SendMessage(requestMessage);
                        break;
                    default:
                        if (!Elapsed.IsRunning) Elapsed.Start();
                        await SendMessage(requestMessage);
                        break;
                }
            }
            catch (Exception ex)
            {
                Terminal.LogLine($"Something bad happend: {ex.Message} {ex.InnerException?.Message}", ConsoleColor.Red);
            }
        }
Beispiel #2
0
 private async Task SendAcknowledgement(Connection first, Connection second)
 {
     var message = Messaging.CreateMessage(new AcknowledgeMessage(second.ScreenWidth, second.ScreenHeight), ServerId, first.Channel, 0);
     await Client.SendAsync(message, message.Length, first.IpEndPoint);
     message = Messaging.CreateMessage(new AcknowledgeMessage(first.ScreenWidth, first.ScreenHeight), ServerId, second.Channel, 0);
     await Client.SendAsync(message, message.Length, second.IpEndPoint);
     Terminal.LogLine($" Channel {first.Channel} has two clients: {first.Id}({first.IpEndPoint}) and {second.Id}({second.IpEndPoint})", ConsoleColor.Green);
     first.Duration.Restart();
     second.Duration.Restart();
 }