Ejemplo n.º 1
0
    private void ClientLoop(object _client)
    {
        var client = _client as TcpClient;

        NetworkStream stream = client.GetStream();
        Player        player = new Player(stream, database);

        // new Packet(Packet.TYPE.HELLO).AddU32((uint)OS.GetTicksMsec()).Send(stream);
        new Packet(Packet.TYPE.HELLO).AddU16(version).Send(stream);

        var bytes = new byte[256];

        GD.Print("Player connected (" + playersOnline.Count + ")");
        statsPlayers++;

        while (true)
        {
            try {
                int read = stream.Read(bytes, 0, bytes.Length);

                if (read == 0)
                {
                    GD.Print("Connection closed");
                    player.LogOut();
                    client.Close();
                    return;
                }
            } catch (System.IO.IOException) {
                GD.Print("Connection error");
                player.LogOut(); //tutaj np. dodanie do hanged connections i czekanie sobie, zamiast logout
                client.Close();
                return;
            }


            Server.statsPacketsReceived++;
            Server.statsBytesReceived += bytes[0];
            var unpacker = new Unpacker(bytes);

            // GD.Print("Received packet: " + unpacker.GetCommand().ToString());

            unpacker.HandlePacket(database, player);
        }

        // client.Close();
    }