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); } }
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(); }