示例#1
0
        protected override void onCompleteConnect(IAsyncResult iar)
        {
            bool      connectResult = false;
            UdpClient tcpc;

            try
            {
                tcpc = (UdpClient)iar.AsyncState;
                IPEndPoint iPEndPoint   = null;
                byte[]     receiveBytes = tcpc.EndReceive(iar, ref iPEndPoint);

                if (receiveBytes[0].Equals(1))
                {
                    udpClient.BeginReceive(onCompleteReadFromServerStream, udpClient);
                    connectResult = true;
                }

                MaintainConnecting_Start();
                fireCompleteConnect();
            }
            catch (Exception ex)
            {
                connectResult = false;
                LogProxy.WriteError(ex.StackTrace);
                fireCompleteDisconnect();
            }
        }
示例#2
0
        public static void FReceiveLobbyPacket(IGamerEntity gamer, Dictionary <byte, object> packet)
        {
            if (!Enum.TryParse(packet[0].ToString(), out EServerLobbyCode code))
            {
                LogProxy.WriteError($"Parse ServerLobbyCode fail, Value:{packet[0]}");
                return;
            }

            switch (code)
            {
            case EServerLobbyCode.Rooms:
                onGetRoomList();
                break;

            case EServerLobbyCode.AllPeers:
                onGetAllRoommates();
                break;

            case EServerLobbyCode.RoomReady:
                onRoommateReady();
                break;
            }

            void onGetRoomList()
            {
                var webRoomPacket    = (RoomPacket[])packet[1];
                int waitingRoomCount = int.Parse(packet[2].ToString());
                int battleRoomCount  = int.Parse(packet[3].ToString());

                gamer.input.SetLevel();
            }

            void onGetAllRoommates()
            {
                var playerPackets = (PlayerPacket[])packet[1];
                int comeDown      = int.Parse(packet[2].ToString());
                var roomID        = packet[3].ToString();

                gamer.mPlayerNameList.Clear();

                for (int i = 0; i < playerPackets.Length; i++)
                {
                    if (playerPackets[i].SlotID == -1)
                    {
                        continue;
                    }
                    gamer.mPlayerNameList.Add(playerPackets[i].SlotID, playerPackets[i].Name);
                    if (playerPackets[i].Name == gamer.account.Info.Name)
                    {
                        gamer.input.SlotID = playerPackets[i].SlotID;
                    }
                }
                gamer.input.TrySetNextLevel(GamerInput.Level.WaitingPeers);
            }

            void onRoommateReady()
            {
                //當 有玩家按 Ready 時觸發
            }
        }
示例#3
0
        public static void FReceiveLobbyPacket(GamerEntity gamer, Dictionary <byte, object> packet)
        {
            if (!Enum.TryParse(packet[0].ToString(), out EServerLobbyCode code))
            {
                LogProxy.WriteError($"Parse ServerLobbyCode fail, Value:{packet[0]}");
                return;
            }

            switch (code)
            {
            case EServerLobbyCode.Rooms:
                //LogProxy.WriteLine($"ServerLobbyCode.Rooms({gamer.account.Info.Name})");
                FReceiveLobbyList(gamer, packet);
                break;

            case EServerLobbyCode.AllPeers:
                //LogProxy.WriteLine($"ServerLobbyCode.AllPeers({gamer.account.Info.Name})");
                FReceiveLobbyInfo(gamer, packet);
                break;

            case EServerLobbyCode.RoomReady:
                //LogProxy.WriteLine($"ServerLobbyCode.RoomReady({gamer.account.Info.Name})");
                break;
                //case EServerLobbyCode.ToArena:
                //    //Console.WriteLine($"ServerLobbyCode.TO_GAMING({gamer.account.Info.Name})");
                //    FLobbyToGaming(gamer);
                //    break;
            }
        }
示例#4
0
 /// <summary>
 /// 連線到伺服器。連線到伺服器時, isConnect == true
 /// </summary>
 /// <returns>是否執行成功</returns>
 public bool ConnectToServer()
 {
     try
     {
         if (Network.NetworkProtocol != NetworkProtocol.WebSocket)
         {
             IPAddress ipa = null;
             int       nPort;
             string    ip   = "";
             string    port = "";
             string[]  s    = Address.Split(new Char[] { ':' });
             ip   = s[0];
             port = s[1];
             if (string.IsNullOrEmpty(ip) || string.IsNullOrEmpty(port))
             {
                 return(false);
             }
             if (!IPAddress.TryParse(ip, out ipa))
             {
                 LogProxy.WriteLine("Please supply an IP Address.");
                 return(false);
             }
             if (!int.TryParse(port, out nPort))
             {
                 nPort = 23000;
             }
             Network.Connect(ipa, nPort);
         }
         else
         {
             Uri uri = new Uri(Address);
             Network.Connect(uri);
         }
         return(true);
     }
     catch (Exception exc)
     {
         LogProxy.WriteError(exc.Message);
         return(false);
     }
 }
示例#5
0
        /// <summary>
        /// 傳送一個 Dictionary 給 Server ,目前 Dictionary.Value 不支援不能序列化的物件,例如 Dictionary 。不能使用多層 Dictionary
        /// </summary>
        /// <param name="code">此封包的索引碼,在伺服器中用此作為索引</param>
        /// <param name="dic">傳給伺服器的封包</param>
        private void deliver(byte code, Dictionary <byte, object> dic)
        {    //普通的傳送
            CanSend = false;
            //宣告一個傳送暫存
            byte[] tx;
            //將傳入的 code , dic , 傳換為我定義的封包
            IPacket packet = new IPacket(code, new Dictionary <byte, object>(dic))
            {
            };

            try
            {
                //將此封包,序列化並加入暫存區
                tx = Math.Serialize.ToByteArray(packet);
                tx = Math.Serialize.Compress(tx);
                Network.BeginSend(tx, tx.Length);
            }
            catch (Exception exc)
            {
                LogProxy.WriteError(exc.Message);
            }
        }
示例#6
0
        private async Task StartReceiveAsync(TcpClient tcpc)
        {
            Task.Run(async() => {
                while (true)
                {
                    try
                    {
                        byte[] buff = new byte[BufferSize];
                        int count   = await tcpClient.GetStream().ReadAsync(buff, 0, buff.Length);

                        Array.Resize(ref buff, count);
                        if (count.Equals(0))
                        {
                            LogProxy.WriteLine("Get Packet Length = 0");
                            DisConnect();
                            break;
                        }
                        Task.Run(() => { try { fireCompleteReadFromServerStream(buff); } catch (Exception e) { LogProxy.WriteError(e.Message); } });
                    }
                    catch (Exception e)
                    {
                        if (!callForTcpClientClose)
                        {
                            DisConnect();
                        }
                        callForTcpClientClose = false;
                        LogProxy.WriteLine(e.Message);
                        break;
                    }
                }
            });
        }