Exemplo n.º 1
0
 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);
         }
     }
 }
Exemplo n.º 2
0
    //自己给自己发消息,用于测试
    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;
    }
Exemplo n.º 3
0
    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();
    }