void FixedUpdate() { if (m_state != State.ST_Disconnected) { if (Sys_GetTime() - m_lstSendTime > 10 * 1000) { CmdPacket packet = new CmdPacket(); packet.WriteUShort(Proto.Keep_Alive); packet.WriteUInt(Sys_GetTime()); send(packet); } if (Sys_GetTime() - m_lstReadTime > 30 * 1000) { //dead } } }
void RecvData(object sender, NetEventArgs e) { Sys_Log(getString(e.Client.RecvPacket.GetReadData())); m_lstReadTime = Sys_GetTime(); UInt16 cmd = 0; CmdPacket packet = e.Client.RecvPacket; packet.ReadUShort(out cmd); switch (cmd) { case Proto.Keep_Alive: { UInt32 time = 0; if (packet.ReadUInt(out time)) { CmdPacket tpacket = new CmdPacket(); tpacket.WriteUShort(Proto.Keep_Alive_Ack); tpacket.WriteUInt(time); send(tpacket); } break; } case Proto.Keep_Alive_Ack: { UInt32 time = 0; if (packet.ReadUInt(out time)) { m_rtt = Sys_GetTime() - time; } break; } case Proto.Synch_Pos: { //同步位置和速度 if (!m_game.m_bSer) { UInt64 time; packet.ReadUInt64(out time); float x, z, vx, vz; packet.ReadFloat(out x); packet.ReadFloat(out z); packet.ReadFloat(out vx); packet.ReadFloat(out vz); m_other.change(time, x, z, vx, vz); } break; } case Proto.C_GameShot: { //同步操作 float vx, vz; packet.ReadFloat(out vx); packet.ReadFloat(out vz); //if (m_game.m_bSer) m_other.shot(vx, vz); break; } case Proto.S_GameInit: { m_state = State.ST_GameInit; break; } case Proto.S_GameStart: { m_state = State.ST_GameRunning; char bSer; if (packet.ReadByte(out bSer)) { m_game.m_bSer = (bSer != 0); } char bottom; if (packet.ReadByte(out bottom)) { m_game.m_bottom = (bottom != 0); } m_game.gameStart(); break; } } }