private bool ProcessPacket()
            {
                lock (m_HeartBeatState)
                {
                    m_HeartBeatState.Reset(m_ResetHeartBeatElapseSecondsWhenReceivePacket);
                }

                try
                {
                    object customErrorData = null;
                    Packet packet          = m_NetworkChannelHelper.DeserializePacket(m_ReceiveState.Stream, out customErrorData);

                    if (customErrorData != null)
                    {
                        if (NetworkChannelCustomError != null)
                        {
                            NetworkChannelCustomError(this, customErrorData);
                        }
                    }

                    if (packet != null)
                    {
                        m_EventPool.Fire(this, packet);
                    }

                    m_ReceiveState.PrepareForPacketHeader(m_NetworkChannelHelper.PacketHeaderLength);
                }
                catch (System.Exception exception)
                {
                    m_Active = false;
                    if (NetworkChannelError != null)
                    {
                        NetworkChannelError(this, NetworkErrorCode.DeserializePacketError, exception.ToString());
                        return(false);
                    }

                    throw;
                }

                return(true);
            }
            protected virtual bool ProcessPacket()
            {
                lock (m_HeartBeatState)
                {
                    m_HeartBeatState.Reset(m_ResetHeartBeatElapseSecondsWhenReceivePacket);
                }

                try
                {
                    object customErrorData = null;
                    Packet packet          = m_NetworkChannelHelper.DeserializePacket(m_ReceiveState.PacketHeader, m_ReceiveState.Stream, out customErrorData);

                    if (customErrorData != null && NetworkChannelCustomError != null)
                    {
                        NetworkChannelCustomError(this, customErrorData);
                    }

                    if (packet != null)
                    {
                        m_ReceivePacketPool.Fire(this, packet);
                    }

                    m_ReceiveState.PrepareForPacketHeader(m_NetworkChannelHelper.PacketHeaderLength);
                }
                catch (Exception exception)
                {
                    m_Active = false;
                    if (NetworkChannelError != null)
                    {
                        SocketException socketException = exception as SocketException;
                        NetworkChannelError(this, NetworkErrorCode.DeserializePacketError, socketException != null ? socketException.SocketErrorCode : SocketError.Success, exception.ToString());
                        return(false);
                    }

                    throw;
                }

                return(true);
            }
Exemple #3
0
 /// <summary>
 /// 抛出事件,这个操作是线程安全的,即使不在主线程中抛出,也可保证在主线程中回调事件处理函数,但事件会在抛出后的下一帧分发。
 /// </summary>
 /// <param name="sender">事件源。</param>
 /// <param name="e">事件参数。</param>
 public void Fire(object sender, CGEventArgs e)
 {
     m_EventPool.Fire(sender, e);
 }
 private void OnNetworkChannelReceived(NetworkChannel networkChannel, Packet packet)
 {
     m_EventPool.Fire(networkChannel, packet);
 }