/// <summary> /// Method responsible for execute the callback of on client connected handler. /// </summary> /// <param name="client">The client instance.</param> private void OnClientConnectedHandler(IClient client) { try { Console.WriteLine($"OnClientConnected: {client.Id}"); using (var kingBuffer = new KingBufferBase()) { kingBuffer.WriteMessagePacket(MyPackets.PlayerPositionsArray); kingBuffer.WriteInteger(_networkPlayersDictionary.Count); foreach (var player in _networkPlayersDictionary) { kingBuffer.WriteInteger(player.Key.Id); kingBuffer.WriteFloat(player.Value.X); kingBuffer.WriteFloat(player.Value.Y); kingBuffer.WriteFloat(player.Value.Z); } _server.SendMessage(client, kingBuffer); if (!_networkPlayersDictionary.ContainsKey(client)) { _networkPlayersDictionary.Add(client, new NetworkPlayer(client)); } _networkPlayersDictionary[client].Moved = true; } } catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}."); } }
/// <summary> /// This method is responsible for sychronize the players positions. /// </summary> public void SynchronizePlayersPositions() { try { var sendPosDict = new Dictionary <IClient, NetworkPlayer>(_networkPlayersDictionary); foreach (var sendToPlayer in sendPosDict) { if (sendToPlayer.Value == null) { continue; } using (var kingBuffer = new KingBufferBase()) { kingBuffer.WriteMessagePacket(MyPackets.PlayerPositionsArray); kingBuffer.WriteInteger(sendPosDict.Count(c => c.Key.Id != sendToPlayer.Key.Id && c.Value.Moved)); int amountPlayersMoved = 0; foreach (var posPlayers in sendPosDict) { if (sendToPlayer.Key.Id == posPlayers.Key.Id) { continue; } if (!posPlayers.Value.Moved) { continue; } kingBuffer.WriteInteger(posPlayers.Key.Id); kingBuffer.WriteFloat(posPlayers.Value.X); kingBuffer.WriteFloat(posPlayers.Value.Y); kingBuffer.WriteFloat(posPlayers.Value.Z); amountPlayersMoved++; } if (amountPlayersMoved > 0) { _server.SendMessage(sendToPlayer.Key, kingBuffer); } } } foreach (var player in _networkPlayersDictionary) { player.Value.Moved = false; } } catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); } }
/// <summary> /// Method responsible for start the clients. /// </summary> /// <param name="ip">The ip address from the server.</param> /// <param name="clientConnections">The number of client connections.</param> public static void StartClients(string ip, int clientConnections) { var kingBuffer = new KingBufferBase(); kingBuffer.WriteString("Sometimes we just need a good networking library"); _stopwatch = Stopwatch.StartNew(); var clientFrequency = 14; var clients = new List <KingClient>(); for (int i = 0; i < clientConnections; ++i) { var client = new KingClient(); client.MessageReceivedHandler = OnMessageReceived; client.Connect(ip); clients.Add(client); Thread.Sleep(15); } Console.WriteLine("started all clients"); var timer = new System.Timers.Timer(1000.0 / clientFrequency); timer.Elapsed += (object sender, ElapsedEventArgs e) => { foreach (var client in clients) { if (client.HasConnected) { // send 2 messages each time client.SendMessage(kingBuffer); client.SendMessage(kingBuffer); _messagesSent += 1; } } // report every 10 seconds if (_stopwatch.ElapsedMilliseconds > 1000 * 10) { long bandwithIn = _dataReceived * 1000 / (_stopwatch.ElapsedMilliseconds * 1024); long bandwithOut = _messagesSent * _bufferLength * 1000 / (_stopwatch.ElapsedMilliseconds * 1024); Console.WriteLine(string.Format("Client in={0} ({1} KB/s) out={2} ({3} KB/s) bufferL={4}", _messagesReceived, bandwithIn, _messagesSent, bandwithOut, _bufferLength)); _stopwatch.Stop(); _stopwatch = Stopwatch.StartNew(); _messagesSent = 0; _dataReceived = 0; _messagesReceived = 0; } }; timer.AutoReset = true; timer.Enabled = true; Console.ReadLine(); timer.Stop(); timer.Dispose(); }