public void Update() { if (!IsNetRun()) { return; } if (m_ConnectState == EConnectState.Connected) { if (m_uNextCheckTime < (int)UnityEngine.Time.realtimeSinceStartup) { m_uNextCheckTime = (uint)UnityEngine.Time.realtimeSinceStartup + 1000u; //这里只能检测客户端网络环境,无法反应是否已经掉线。 if (m_CurNetwork != Application.internetReachability) { Shutdown(); Debug.Log("internetReachability Network changed"); } } object privateLockObject; Monitor.Enter(privateLockObject = m_PrivateLockObject); try { while (m_RecvQueue.Count > 0) { WfPacket packet = m_RecvQueue.Dequeue(); GameDll.PacketHandlerManager.ProcessPacket(packet); packet.DestroyClass(); } //对消息进行一个分帧优化处理 //int count = m_RecvQueue.Count; //if (count >= 10) //{ // for (int i = 0; i < 10; ++i) // { // //我们只要先收到的10条消息在这帧处理 // WfPacket packet = m_RecvQueue.Dequeue(); // PacketHandlerMgr.GetInstance().ProcessPacket(packet); // } //} //else //{ // for (int i = 0; i < count; ++i) // { // WfPacket packet = m_RecvQueue.Dequeue(); // PacketHandlerMgr.GetInstance().ProcessPacket(packet); // } //} } finally { Monitor.Exit(privateLockObject); } } }
//自己给自己发消息,用于测试 public static void SendPacketToMe(NetworkProtol np, ISerializePacket msg, ushort msgType) { WfPacket pak = PooledClassManager <WfPacket> .CreateClass(); pak.InitWrite(msgType); msg.Serialize(pak); pak.Swap(); if (np == NetworkProtol.Tcp) { GameDll.PacketHandlerManager.ProcessPacket(pak); } else if (np == NetworkProtol.Kcp) { //KCPPacketHandlerMgr.GetInstance().ProcessPacket(pak); } pak.DestroyClass(); pak = null; }
private void WfNetworkThread() { HeaderBytes headbytes = PooledClassManager <HeaderBytes> .CreateClass(); DataBytes databytes = null; int recvedNum = 0; WfPacket sendPacket = null; int sendedNum = 0; while (m_Thread.IsAlive) { try { Thread.Sleep(10); if (m_ConnectState == EConnectState.PostConnecting) { databytes = null; recvedNum = 0; if (sendPacket != null) { sendPacket.DestroyClass(); sendPacket = null; } sendedNum = 0; ConnectServer(); } if (m_ConnectState == EConnectState.Connected) { string errorText = null; bool bWaiting = false; do { errorText = RecvAll(ref headbytes, ref databytes, ref recvedNum, ref bWaiting); }while (errorText == null && !bWaiting); if (errorText == null) { object privateLockObject; Monitor.Enter(privateLockObject = m_PrivateLockObject); try { while (m_SendQueue.Count > 0 || sendPacket != null) { if (sendPacket != null) { errorText = SendAll(sendPacket, ref sendedNum); if (sendedNum == sendPacket.GetOffset()) { sendPacket.DestroyClass(); sendPacket = null; } } if (errorText != null || sendPacket != null || m_SendQueue.Count <= 0) { break; } sendedNum = 0; sendPacket = m_SendQueue.Dequeue(); sendPacket.SetHeadLength(); } } finally { Monitor.Exit(privateLockObject); } } if (errorText != null) { Debug.LogError(errorText); object privateLockObject; Monitor.Enter(privateLockObject = m_PrivateLockObject); try { if (m_ConnectState != EConnectState.PostConnecting) { m_ConnectState = EConnectState.Disconnected; m_bNetStateChanged = true; //GameDll.CGameProcedure.s_EventManager.OnNetStateChanged.SafeInvoke((int)NetworkProtol.Tcp, (int)m_ConnectState); } } finally { Monitor.Exit(privateLockObject); } } } } catch (Exception ex) { Debug.LogError(ex.Message + ex.StackTrace); object privateLockObject; Monitor.Enter(privateLockObject = m_PrivateLockObject); try { if (m_ConnectState != EConnectState.PostConnecting) { m_ConnectState = EConnectState.Disconnected; m_bNetStateChanged = true; //GameDll.CGameProcedure.s_EventManager.OnNetStateChanged.SafeInvoke((int)NetworkProtol.Tcp, (int)m_ConnectState); } } finally { Monitor.Exit(privateLockObject); } } } m_Thread.Abort(); m_Thread.Join(); }