public void OnConnected() { NetCore.Init(); NetSender.Init(); NetReceiver.Init(); // TODO: do handshake rpc }
private Thread _sendHeartBeatThread; // send and receive heartbeat msg thread //constructor, init NetCore,NetSender,NetReceiver, add receiver handler, start check network thread public NetWorkClient() { var forInit = Loom.Current;//to initialize Loom in mainThread TheUserLoginState = UserLoginState.NullState; TheUserMatchState = UserMatchState.NullState; MultiGameState = GameState.Game_NullState; AllPlayers = new List <MultiPlayerInfo>(); // Debug.Log("init netclient"); NetCore.Init(); NetCore.SocketDisconnectHandler += Reconnect; NetSender.Init(); NetReceiver.Init(); SetupNetReceiverHandler(); StartConnect(); //mChen //_checkNetworkThread = new Thread(CheckHeartBeat) { IsBackground = true }; ////防止后台现成。相反需要后台线程就设为false //_checkNetworkThread.Start(); //while (_checkNetworkThread.IsAlive == false) //{ //} }
// Use this for initialization void Start() { NetCore.Init(); NetReceiver.Init(); NetSender.Init(); var goTestWin = GameObject.Find("TestWin"); // 打开测试界面 goTestWin.AddComponent <TestWin>(); }
//初始化事件派发 TODOCjc void initEventDispatch() { NetReceiver.AddHandler <Protocol.foobar>( (SprotoTypeBase sp, long session) => { EventManager.instance.FireEvent(EVENTKEY.net_Recv, sp, session); return(null); } ); }
private void InitMain() { Debug.Log("开始初始化网络"); NetCore.Init(); NetSender.Init(); NetReceiver.Init(); NetCore.enabled = true; }
override public void Init() { NetSender.Init(); NetReceiver.Init(); NetCore.Init(); NetCore.enabled = true; Connect(); }
void Awake() { if (!bInit) { bInit = true; NetCore.Init(); NetSender.Init(); NetReceiver.Init(); DontDestroyOnLoad(gameObject); } }
public static void Dispatch() { package pkg = new package(); lock (queueLock) { if (recvQueue.Count == 0) { return; } Queue <byte[]> tmpQueue = recvQueue; recvQueue = dispatchQueue; dispatchQueue = tmpQueue; } if (dispatchQueue.Count > 20) { Debug.Log("dispatchQueue.Count: " + dispatchQueue.Count); } while (dispatchQueue.Count > 0) { byte[] data = recvPack.unpack(dispatchQueue.Dequeue()); int offset = pkg.init(data); int tag = (int)pkg.type; long session = (long)pkg.session; if (pkg.HasType) { RpcReqHandler rpcReqHandler = NetReceiver.GetHandler(tag); if (rpcReqHandler != null) { SprotoTypeBase rpcRsp = rpcReqHandler(protocol.GenRequest(tag, data, offset)); if (pkg.HasSession) { Send(rpcRsp, session, tag); } } } else { RpcRspHandler rpcRspHandler = NetSender.GetHandler(session); if (rpcRspHandler != null) { ProtocolFunctionDictionary.typeFunc GenResponse; sessionDict.TryGetValue(session, out GenResponse); rpcRspHandler(GenResponse(data, offset)); } } } }
void Register() { NetReceiver.AddHandler <ServerProtocol.characterupdate>((_) => { ServerSprotoType.characterupdate.request rsp = _ as ServerSprotoType.characterupdate.request; if (monsterObjList.ContainsKey(rsp.info.tempid)) { Debug.Log("角色进入视野:" + rsp.info.tempid); monsterObjList[rsp.info.tempid].SetActive(true); } else { Debug.Log("添加角色:" + rsp.info.tempid + " 坐标:" + rsp.info.pos.x + "," + rsp.info.pos.y + "," + rsp.info.pos.z); GameObject obj = Instantiate(monsterObj); ThirdPersonCharacter tpc = obj.GetComponent <ThirdPersonCharacter>(); tpc.characterName.text = rsp.info.name; obj.transform.position = new Vector3(rsp.info.pos.x / 10, rsp.info.pos.y / 10, rsp.info.pos.z / 10); obj.SetActive(true); monsterObjList[rsp.info.tempid] = obj; } return(null); }); NetReceiver.AddHandler <ServerProtocol.characterleave>((_) => { ServerSprotoType.characterleave.request rsp = _ as ServerSprotoType.characterleave.request; foreach (var item in rsp.tempid) { if (monsterObjList.ContainsKey(item)) { Debug.Log("角色离开视野:" + item); monsterObjList[item].SetActive(false); } } return(null); }); NetReceiver.AddHandler <ServerProtocol.moveto>((_) => { ServerSprotoType.moveto.request rsp = _ as ServerSprotoType.moveto.request; foreach (var item in rsp.move) { if (monsterObjList.ContainsKey(item.tempid)) { AICharacterControl tpc = monsterObjList[item.tempid].GetComponent <AICharacterControl>(); tpc.SetTarget(new Vector3(item.pos.x / 10, item.pos.y / 10, item.pos.z / 10)); } } return(null); }); }
private System.Random rand = new System.Random(2); //实例化后 void Start() { _txtTips = transform.Find("TxtTips").GetComponent <Text>(); Button btnLogin = transform.Find("BtnLogin").GetComponent <Button>(); Button btnTest1 = transform.Find("Test1").GetComponent <Button>(); Button btnCreate = transform.Find("BtnCreate").GetComponent <Button>(); UIEventTriggerListener.Get(btnLogin.gameObject).onClick = OnClickLogin; UIEventTriggerListener.Get(btnTest1.gameObject).onClick = OnClickTest1; //监听服务端主推的协议 NetReceiver.AddHandler <ProtoProtocol.sync_role_offline>(RoleOffline); _txtTips.text = "login .."; lastHeartTime = 0; heartTimeFlag = 0; loginStatus = false; startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); }
void Register() { NetReceiver.AddHandler <ServerProtocol.subid>((_) => { // 账号密码服务器验证返回 ServerSprotoType.subid.request rsp = _ as ServerSprotoType.subid.request; Debug.Log(rsp.result.Substring(0, 3)); int code = Convert.ToInt32(rsp.result.Substring(0, 3)); if (code == 200) { gameIP = rsp.gateip; gamePort = (int)rsp.gateport; // 验证成功时连接至gameserver Debug.Log("登陆服务器认证成功!"); PlayerInfo.Instance.Subid = Utilities.UnBase64String(rsp.result.Substring(4)); GameConnect(); } return(null); }); }
public static void Dispatch() { //Debug.Log("dis"); try { package pkg = new package(); if (recvQueue.Count > 20) { Debug.Log("recvQueue.Count: " + recvQueue.Count); } while (recvQueue.Count > 0) { //Debug.Log("dis"); byte[] data = recvPack.unpack(recvQueue.Dequeue()); int offset = pkg.init(data); int tag = (int)pkg.type; long session = (long)pkg.session; if (pkg.HasType) { //Debug.Log("type"); try { RpcReqHandler rpcReqHandler = NetReceiver.GetHandler(tag); if (rpcReqHandler != null) { SprotoTypeBase rpcRsp = rpcReqHandler(protocol.GenRequest(tag, data, offset)); if (pkg.HasSession) { Send(rpcRsp, session, tag); } } } catch (Exception e) { Debug.Log("NetReceiver exception: " + e.Message + tag + session + offset); throw; } } else { //Debug.Log("no type"); try { RpcRspHandler rpcRspHandler = NetSender.GetHandler(session); if (rpcRspHandler != null) { ProtocolFunctionDictionary.typeFunc GenResponse; sessionDict.TryGetValue(session, out GenResponse); rpcRspHandler(GenResponse(data, offset)); } } catch (Exception e) { Debug.Log("NetReceiver exception: " + e.Message + tag + session + offset); throw; } } } } catch (Exception e) { Debug.Log("Dispatch exception: " + e.Message); throw; } }
public void SetNetReceiver(NetReceiver _netReceiver) { netReceiver = _netReceiver; }
private void SetupNetReceiverHandler() { NetReceiver.AddHandler <Protocol.handshake>((_) => { Debug.Log("handshake"); SprotoType.handshake.request req = _ as handshake.request; switch (TheUserLoginState) { case UserLoginState.LoginStart: { //Debug.Log("challenge receive "); _challengeStr = Convert.FromBase64String(req.msg); DH64 dhforKey = new DH64(); dhforKey.KeyPair(out _privateKey, out _publicKey); SprotoType.handshake.request clientkey = new handshake.request(); clientkey.msg = Convert.ToBase64String(BitConverter.GetBytes(_publicKey)); clientkey.socketfd = req.socketfd; NetSender.Send <Protocol.handshake>(clientkey); Debug.Log("challengeStr" + _challengeStr + " ori " + req.msg + " fd " + clientkey.socketfd); TheUserLoginState = UserLoginState.LoginPublicServerKey; } break; case UserLoginState.LoginPublicServerKey: { //string serverKey = System.Text.Encoding.Default.GetString(Convert.FromBase64String(req.msg)); byte[] ServerKey = Convert.FromBase64String(req.msg); ulong serverKey = BitConverter.ToUInt64(ServerKey, 0); _secretKey = DH64.Secret(_privateKey, serverKey); SprotoType.handshake.request challengeMsg = new handshake.request(); challengeMsg.msg = Convert.ToBase64String( BitConverter.GetBytes( HMac64.hmac( BitConverter.ToUInt64(_challengeStr, 0), _secretKey))); challengeMsg.socketfd = req.socketfd; NetSender.Send <Protocol.handshake>(challengeMsg); TheUserLoginState = UserLoginState.LoginCheckSecret; } break; case UserLoginState.LoginCheckSecret: { if (Convert.ToBase64String(Encoding.UTF8.GetBytes(challengeSuccess)) == req.msg) { if (UserName != string.Empty) { Debug.Log("login " + UserName); string token = string.Format("{0}:{1}", Convert.ToBase64String(Encoding.UTF8.GetBytes(UserName)), Convert.ToBase64String(Encoding.UTF8.GetBytes(PassWord))); SprotoType.handshake.request tokenMsg = new handshake.request { msg = DesCrypt.desencode(_secretKey, token), socketfd = req.socketfd }; NetSender.Send <Protocol.handshake>(tokenMsg); TheUserLoginState = UserLoginState.LoginCheckTokenResult; } else { Debug.Log("register"); DisplayName = RandomName.GetRandomName(); string token = Convert.ToBase64String(Encoding.UTF8.GetBytes(DisplayName)); SprotoType.handshake.request tokenMsg = new handshake.request { msg = DesCrypt.desencode(_secretKey, token), socketfd = req.socketfd }; NetSender.Send <Protocol.handshake>(tokenMsg); TheUserLoginState = UserLoginState.LoginRegistResult; } } else if (Convert.ToBase64String(Encoding.UTF8.GetBytes(challengeFailed)) == req.msg) { Debug.Log("sercet incorrect!"); //error handle TheUserLoginState = UserLoginState.LoginFailed; } } break; case UserLoginState.LoginRegistResult: { var msg = Encoding.UTF8.GetString(Convert.FromBase64String(req.msg)); var msgArray = msg.Split(':'); UserName = Encoding.UTF8.GetString(Convert.FromBase64String(msgArray[0])); PassWord = Encoding.UTF8.GetString(Convert.FromBase64String(msgArray[1])); Loom.QueueOnMainThread(() => { //save registed info PlayerPrefs.SetString("username", UserName); //GameManager.NetWorkClient.UserName = String.Empty; PlayerPrefs.SetString("password", PassWord); PlayerPrefs.SetString("displayname", DisplayName); Debug.Log("saving name " + UserName + " : " + PassWord); PlayerPrefs.Save(); }); Debug.Log("name " + UserName + " : " + PassWord); //Thread.Sleep(5); TheUserLoginState = UserLoginState.LoginSuccess; } break; case UserLoginState.LoginCheckTokenResult: case UserLoginState.LoginSuccess: { if (Convert.ToBase64String(Encoding.UTF8.GetBytes(challengeSuccess)) == req.msg) { //Thread.Sleep(5); Debug.Log("token right"); TheUserLoginState = UserLoginState.LoginSuccess; // mChen //if(MultiGameState == GameState.Game_NullState) //{ // FindMatch(); //} } else if (Convert.ToBase64String(Encoding.UTF8.GetBytes(challengeFailed)) == req.msg) { //error handle TheUserLoginState = UserLoginState.LoginFailed; } } break; } //NetSender.Send<Protocol.handshake>(req); //Debug.Log(TheUserLoginState.ToString()); return(null); }); NetReceiver.AddHandler <Protocol.matchMsg>((_) => { SprotoType.matchMsg.request req = _ as matchMsg.request; switch (req.matchMsgType) { case (Int64)MatchMsgType.Match_PlayerJoinedRoom: int playerTeamType = Convert.ToInt32(req.matchInfo); TheUserMatchState = UserMatchState.JoinedRoom; Debug.Log("NetReceiver: matchMsg: MatchMsgType.Match_PlayerJoinRoom: playerTeamType=" + playerTeamType); break; case (Int64)MatchMsgType.Match_CountDownTime: float countDowmTime = Convert.ToSingle(req.matchInfo) / 100; Debug.Log("NetReceiver: matchMsg: MatchMsgType.Match_CountDownTime =" + countDowmTime); // UI Loom.QueueOnMainThread(() => { UIManager.GetInstance().ShowMatchStartCountDown(countDowmTime); }); break; case (Int64)MatchMsgType.Match_TryToJoinMatch: int result = Convert.ToInt32(req.matchInfo); Debug.Log("NetReceiver: matchMsg: MatchMsgType.Match_TryToJoinMatch: result=" + result); MultiGameState = GameState.Game_Match; if (result == 0) { TheUserMatchState = UserMatchState.WaitToJoinNextMatch; Loom.QueueOnMainThread(() => { UIManager.GetInstance().ShowWaitToJoinNextMatchLabel(); }); } else if (result == 1) { TheUserMatchState = UserMatchState.PlayingMatch; Loom.QueueOnMainThread(() => { UIManager.GetInstance().HideWaitToJoinNextMatchLabel(); }); } else { Debug.Log("error TryToJoinMatch result from Server" + result); throw new Exception("error TryToJoinMatch result from Server"); } break; //case (Int64)MatchMsgType.Match_CancelMatching: // if (QuitMatchingMsg != null) // { // QuitMatchingMsg(this, EventArgs.Empty); // } // break; default: Debug.Log("error match type" + req.matchMsgType); throw new Exception("error msg type"); } return(null); }); NetReceiver.AddHandler <Protocol.usersInfoMsg>((_) => { if (MultiGameState == GameState.Game_NullState) { return(null); } Debug.Log("get usersInfoMsg"); SprotoType.usersInfoMsg.request req = _ as SprotoType.usersInfoMsg.request; GameObjectsManager.s_LocalPlayerIndexInGlobal = (int)req.curUserGlobalIndex; //Debug.Log("get player index in global: " + GameObjectsManager.s_LocalPlayerIndexInGlobal); //Create players Loom.QueueOnMainThread(() => { AllPlayers.Clear(); GameObjectsManager.GetInstance().ClearPlayers(); Debug.Log("received usersInfoMsg:"); foreach (SprotoType.UserInfo serverPlayerinfo in req.userArray) { PlayerTeam.PlayerTeamType teamType = (PlayerTeam.PlayerTeamType)serverPlayerinfo.playerTeamType; PlayerTeam team = GameObjectsManager.GetInstance().GetPlayerTeam(teamType); int userState = (int)serverPlayerinfo.userState; Debug.Log(" UserIndexInGlobal=" + serverPlayerinfo.playerIndex + " UserName="******" userState=" + userState + " TeamType=" + teamType); if (serverPlayerinfo.playerIndex == req.curUserGlobalIndex) { // is local player if (userState == (int)UserMatchState.PlayingMatch) { GameObjectsManager.s_LocalHumanTeamType = teamType; } } int playerIndexInTeam = -1; if (userState == (int)UserMatchState.PlayingMatch) { // create a new player playerIndexInTeam = team.AddAPlayer(false); } // set AllPlayers AllPlayers.Add(new MultiPlayerInfo { PlayIndexInGlobal = serverPlayerinfo.playerIndex, PlayerName = serverPlayerinfo.username, SkinId = 0, PlayerId = 1, ThePlayerTeamType = teamType, PlayerIndexInTeam = playerIndexInTeam }); } }); //TheUserMatchState = UserMatchState.AllPlayersJoinedRoom; return(null); }); NetReceiver.AddHandler <Protocol.waitforstart>((_) => { Debug.Log("Second half start!!"); var res = _ as SprotoType.waitforstart.request; //mChen //switch (GameManager.GetInstance().TheGamePrePeriod) //{ // case GamePeriod.Opening: // break; // case GamePeriod.FirstHalf: // break; // case GamePeriod.Halftime: // break; // case GamePeriod.CutsceneAfterScoredOr24SecondsViolation: // break; // case GamePeriod.WairForGameToContinue: // break; // case GamePeriod.SecondHalf: // GameManager.GetInstance().HalfTimeReadyFrame = res.readyFrame; // break; // case GamePeriod.Ending: // break; // default: // throw new ArgumentOutOfRangeException(); //} return(null); }); NetReceiver.AddHandler <Protocol.gameTick>((_) => { //Debug.Log("response called"); if (false)//mChen if (GameManager.TheGameMode > GameMode.MultiGame_3v3) { //when single mode, do not handle this server tick return(null); } if (MultiGameState == GameState.Game_Match) { MultiGameState = GameState.Game_Running; Loom.QueueOnMainThread(() => { UIManager.GetInstance().HideMatchStartCountDown(); }); //mChen _sendHeartBeatThread = new Thread(SendHeartBeatMsg) { IsBackground = true }; //防止后台现成。相反需要后台线程就设为false _sendHeartBeatThread.Start(); while (_sendHeartBeatThread.IsAlive == false) { } } SprotoType.gameTick.request res = _ as gameTick.request; { // bool bOnlyFrameInfo = true; if (res.HasButtonMsg) { //mChen //foreach (var btnMsg in res.buttonMsg) //{ // ButtonInfo msg = new ButtonInfo // { // TeamType = // (PlayerTeamType)((btnMsg.playerIndex) / GameManager.TeamPlayerNum), // PlayerIndexInTeam = (btnMsg.playerIndex) % GameManager.TeamPlayerNum, // FrameNum = res.frame, // Action = (ButtonAction)btnMsg.btnAction, // Type = (ButtonType)btnMsg.btnType // }; // if (btnMsg.HasBtnValueX) // { // msg.Value.x = (float)BitConverter.ToDouble(BitConverter.GetBytes(btnMsg.btnValueX), 0); // msg.Value.y = (float)BitConverter.ToDouble(BitConverter.GetBytes(btnMsg.btnValueY), 0); ; // } // ControlManager.GetInstance().AddControlInfo(msg); // //Debug.Log("Button msg"); //} // bOnlyFrameInfo = false; } //_controllerMsg.Clear(); if (res.HasControlMsg) { //Debug.Log("controller called"); //List < ControlMsg > tempList = new List<ControlMsg>(); foreach (var resControl in res.controlMsg) { //mChen //DPadInfo msg = new DPadInfo //{ // FrameNum = res.frame, // TeamType = (PlayerTeamType)(resControl.playerIndex / GameManager.TeamPlayerNum), // PlayerIndexInTeam = resControl.playerIndex % GameManager.TeamPlayerNum, // //H = Convert.ToSingle(resControl.x), // //V = Convert.ToSingle(resControl.y) // H = (float)BitConverter.ToDouble(BitConverter.GetBytes(resControl.x), 0), // V = (float)BitConverter.ToDouble(BitConverter.GetBytes(resControl.y), 0) //}; //ControlManager.GetInstance().AddControlInfo(msg); #if false if (ControlManager.GetInstance().GameFrameNum % 150 == 1) { GameManager.GetInstance().InfoStr += string.Format("\n dpad info {0} {1} at frame {2}", msg.H, msg.V, ControlManager.GetInstance().GameFrameNum); } #endif // Debug.LogFormat("dpad msg frame {0} : h {1} v {2} ", res.frame, msg.H, msg.V); } // bOnlyFrameInfo = false; } if (res.HasPlayersGamePlayMsg) { Loom.QueueOnMainThread(() => { foreach (var playerGamePlayMsg in res.playersGamePlayMsg) { int playerIndex = (int)playerGamePlayMsg.playerIndex; float posX = (float)BitConverter.ToDouble(BitConverter.GetBytes(playerGamePlayMsg.posX), 0); float posY = (float)BitConverter.ToDouble(BitConverter.GetBytes(playerGamePlayMsg.posY), 0); float posZ = (float)BitConverter.ToDouble(BitConverter.GetBytes(playerGamePlayMsg.posZ), 0); float angleX = (float)BitConverter.ToDouble(BitConverter.GetBytes(playerGamePlayMsg.angleX), 0); float angleY = (float)BitConverter.ToDouble(BitConverter.GetBytes(playerGamePlayMsg.angleY), 0); float angleZ = (float)BitConverter.ToDouble(BitConverter.GetBytes(playerGamePlayMsg.angleZ), 0); //Debug.Log("playerInfoMsg:" + playerGamePlayMsg.playerIndex + " pos:" + posX + posY + posZ); if (playerIndex == GameObjectsManager.s_LocalPlayerIndexInGlobal) { } else { PlayerTeam.PlayerTeamType teamType = AllPlayers[playerIndex].ThePlayerTeamType; int playerIndexInTeam = AllPlayers[playerIndex].PlayerIndexInTeam; PlayerBase player = GameObjectsManager.GetInstance().GetPlayer(teamType, playerIndexInTeam); if (player != null) { player.transform.position = new Vector3(posX, posY, posZ); player.transform.eulerAngles = new Vector3(angleX, angleY, angleZ); } } } }); } //添加一般帧信息 //if (bOnlyFrameInfo) { //mChen ControlManager.GetInstance().AddControlInfo(res.frame); } } return(null); }); NetReceiver.AddHandler <Protocol.restoreStates>((_) => { var req = _ as SprotoType.restoreStates.request; TheUserMatchState = (UserMatchState)req.serverState; Debug.Log("resotre user state now " + TheUserMatchState.ToString()); var infoArray = req.stateInfo.Split(':'); switch (req.serverState) { case (int)UserMatchState.FindRoom: ParseFindMatchMsg(infoArray); TheUserMatchState = UserMatchState.FindRoom; //mChen Loom.QueueOnMainThread(GameUIManager.GetInstance().UIChangeToMatching); //GameUIManager.GetInstance().UIChangeToMatching();//go to matching ui break; } return(null); }); }