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(); } }
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 時觸發 } }
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; } }
/// <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); } }
/// <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); } }
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; } } }); }