Ejemplo n.º 1
0
        private static void ReceiveCallback(IAsyncResult ar)
        {
            Player currentPlayer       = (Player)ar.AsyncState;
            int    receivedBytesLength = 0;

            try {
                receivedBytesLength = currentPlayer.Connection.ClientSocket.EndReceive(ar);
            } catch (Exception) {
                Logger.LogError(string.Format("{0} ID'li oyuncunun istemcisi zorla kapatıldı!", currentPlayer.PlayerID));
                //Çıkan oyuncuyu, oyuncu listesinden siliyoruz.
                PlayerManager.RemovePlayer(currentPlayer);
                return;
            }
            if (receivedBytesLength <= 0)
            {
                AllUtils.Disconnect(currentPlayer, false);
            }
            else
            {
                string receivedText = Encoding.Default.GetString(currentPlayer.Connection.ReceiveByteBuffer, 0, receivedBytesLength);
                Logger.LogInfo(string.Format("[RECEIVE] Alınan veri: [{0}], Uzunluk: [{1}], Player ID: [{2}]", receivedText, receivedBytesLength, currentPlayer.PlayerID));
                //Gelen datayı işlenmesi için ilgili methoda yönlendiriyoruz.
                DataHandler.HandleReceivedData(currentPlayer, receivedText);
            }
            //Tekrar dinleyerek sonsuz bir döngü oluşturuyoruz.
            Receive(currentPlayer);
        }
        /// <summary>
        /// Sunucuyla bağlantı kuran istemcinin bize ait olup olmadığını teyit eder.
        /// </summary>
        /// <param name="playerObject">Teyidi yapılacak olan objedir.</param>
        public static async void ValidatePlayer(Player playerObject)
        {
            await Task.Delay(1000);

            if (playerObject.IsValidated == false)
            {
                AllUtils.Disconnect(playerObject, true);
            }
        }
        public static void HandleReceivedData(Player playerObject, string receivedData)
        {
            //Gelen verileri bölüyoruz.
            string[] splittedData = receivedData.Split('\t');
            //Bölünmüş verinin ilk kısmı opcode'u temsil eder. ushort'a çevirmeye çalışıyoruz.
            ushort clientOpcode = ushort.TryParse(splittedData[0], out clientOpcode) ? clientOpcode : (ushort)0;

            //Opcode 0'a eşitse yanlışlık var demektir. İstemci uzaklaştırılıyor.
            if (clientOpcode == 0)
            {
                AllUtils.Disconnect(playerObject, true);
                return;
            }

            switch (clientOpcode)
            {
            case (ushort)Opcode.EXIT_APP:
                Logger.LogWarning(string.Format("{0} ID'li oyuncu, çıkış yapmayı talep etti...", playerObject.PlayerID));
                AllUtils.Disconnect(playerObject, false);
                break;

            case (ushort)Opcode.ROOM_CODE:
                playerObject.IsValidated = true;
                //Oyuncuya, kendi player id'sini gönderiyoruz.
                Sender.Send(string.Format("{0}\t{1}", (ushort)Opcode.PLAYER_ID, playerObject.PlayerID), playerObject);
                Logger.LogWarning(string.Format("{0} ID'li oyuncu, oda oluşturma talebi gönderdi...", playerObject.PlayerID));
                Room roomObject1 = RoomManager.CreateRoom();
                Sender.Send(string.Format("{0}\t{1}", (int)Opcode.ROOM_CODE, roomObject1.RoomID), playerObject);
                Logger.LogWarning(string.Format("{0} ID'li oyuncu için bir oda oluşturuldu. Oda ID: {1}", playerObject.PlayerID, roomObject1.RoomID));
                break;

            case (ushort)Opcode.JOIN_ROOM:
                Logger.LogWarning(string.Format("{0} ID'li oyuncu, {1} ID'li odaya girmeyi talep etti...", playerObject.PlayerID, splittedData[1]));
                PlayerManager.JoinRoom(playerObject, splittedData[1]);
                break;

            case (ushort)Opcode.ATTACK_REQUEST:
                GameManager.SetPlayerAttack(playerObject, splittedData[1]);
                break;

            default:
                Logger.LogError(string.Format("Opcode bulunamadı: {0}, Oyuncu: {1}", clientOpcode, playerObject.PlayerID));
                AllUtils.Disconnect(playerObject, true);
                break;
            }
        }