Example #1
0
        /// <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}.");
            }
        }
Example #2
0
        /// <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}");
            }
        }
Example #3
0
        /// <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();
        }