public async void HandlePackets()
        {
            while (true)
            {
                while (this.packetQueue.TryDequeue(out PacketQueueEntry queueEntry))
                {
                    switch (queueEntry.PacketId)
                    {
                    case PacketId.PACKET_ID_PLAYER_JOIN:
                        HandlePlayerJoin(queueEntry.Client);
                        break;

                    case PacketId.PACKET_ID_PLAYER_JOINDATA:
                        PlayerJoinDataPacket joinDataPacket = new PlayerJoinDataPacket();
                        joinDataPacket.Read(queueEntry.Data);
                        HandlePlayerJoinData(queueEntry.Client, joinDataPacket);
                        break;

                    case PacketId.PACKET_ID_PLAYER_QUIT:
                    case PacketId.PACKET_ID_PLAYER_TIMEOUT:
                        HandlePlayerQuit(queueEntry.Client);
                        break;
                    }
                }
                await Task.Delay(this.sleepInterval);
            }
        }
        protected override void HandlePacket(PacketQueueEntry queueEntry)
        {
            switch (queueEntry.PacketId)
            {
            case PacketId.PACKET_ID_PLAYER_JOIN:
                HandleClientJoin(queueEntry.Client);
                break;

            case PacketId.PACKET_ID_PLAYER_JOINDATA:
                PlayerJoinDataPacket joinDataPacket = new PlayerJoinDataPacket();
                joinDataPacket.Read(queueEntry.Data);
                HandleClientJoinData(queueEntry.Client, joinDataPacket);
                break;

            case PacketId.PACKET_ID_PLAYER_QUIT:
            case PacketId.PACKET_ID_PLAYER_TIMEOUT:
                HandleClientQuit(queueEntry.Client);
                break;
            }
        }