private void ProcessConnect(object sender, SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) { MDebug.Log(LOG_TAG, $"Client({GetName()}) 连接成功"); m_BufferPool = new ArrayPool <byte>(1024 * 512); lock (m_TcpConnectActionLock) { m_TcpConnectData = new TcpConnectData(this, e, ConnectState.Connected); } m_IsSending = false; lock (m_BufferPool) { m_SendEventArgs = new SocketAsyncEventArgs(); m_SendEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(ProcessSend); m_SendingBuffer = m_BufferPool.AllocBuffer(DEFAULT_BUFFER_SIZE); m_WaitSendBuffer = m_BufferPool.AllocBuffer(DEFAULT_BUFFER_SIZE); m_WaitSendBufferSize = 0; m_SendEventArgs.SetBuffer(m_SendingBuffer.GetBuffer(), m_SendingBuffer.GetOffset(), 0); m_ReceiveEventArgs = new SocketAsyncEventArgs(); m_ReceiveEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(ProcessReceive); m_ReceiveBuffer = m_BufferPool.AllocBuffer(DEFAULT_BUFFER_SIZE); m_ReceiveEventArgs.SetBuffer(m_ReceiveBuffer.GetBuffer(), m_ReceiveBuffer.GetOffset(), m_ReceiveBuffer.GetSize()); m_ReceiveState = ReceiveState.ReceivingPackageLength; m_ReceivedPackageCount = 0; m_ReceiveHeaderBuffer = m_BufferPool.AllocBuffer(PACKAGE_HEADER_SIZE); } lock (m_ReceiveLock) { m_ReceivedPackages = new Queue <ArrayPool <byte> .Node>(); m_ReceivedPackages2 = new BetterList <ArrayPool <byte> .Node>(4); m_ReceivedPackages2._SetCount(m_ReceivedPackages2.Capacity); } StartReceive(); } else { MDebug.LogError(LOG_TAG , $"Client({GetName()}) 连接失败: {e.SocketError.ToString()}\n{e.ConnectByNameError.ToString()}"); lock (m_TcpConnectActionLock) { m_TcpConnectData = new TcpConnectData(this, e, ConnectState.ConnectFailed); } m_Client.Close(); m_Client = null; } }
public override void OnUpdate(float deltaTime) { lock (m_TcpConnectActionLock) { if (m_TcpConnectData != null) { try { switch (m_TcpConnectData.ConnectState) { case ConnectState.Connected: OnConnected?.Invoke(m_TcpConnectData); break; case ConnectState.ConnectFailed: OnConnectFailed?.Invoke(m_TcpConnectData); break; case ConnectState.Disconnected: OnDisconnected?.Invoke(m_TcpConnectData); break; default: MDebug.Assert(false, LOG_TAG, "Not handle ConnectState: " + m_TcpConnectData.ConnectState); break; } } catch (Exception e) { MDebug.LogError(LOG_TAG , $"Inove connect:{m_TcpConnectData.ConnectState} Exception:\n{e.ToString()}"); } m_TcpConnectData = null; } } if (!IsConnected() || m_ReceivedPackages2 == null) { return; } int packageCount; lock (m_ReceiveLock) { packageCount = m_ReceivedPackages.Count; if (m_ReceivedPackages2.Capacity < packageCount) { m_ReceivedPackages2.Capacity = m_ReceivedPackages2.Capacity * 2; m_ReceivedPackages2._SetCount(m_ReceivedPackages2.Capacity); } for (int iPackage = 0; iPackage < packageCount; iPackage++) { m_ReceivedPackages2[iPackage] = m_ReceivedPackages.Dequeue(); } #if GF_DEBUG MDebug.Assert(m_ReceivedPackages.Count == 0, LOG_TAG, "m_ReceivedPackages.Count == 0"); #endif } if (packageCount > 0) { if (OnReceivedPackage != null) { for (int iPackage = 0; iPackage < packageCount; iPackage++) { ArrayPool <byte> .Node iterPackage = m_ReceivedPackages2[iPackage]; try { OnReceivedPackage.Invoke(iterPackage); } catch (Exception e) { MDebug.LogError(LOG_TAG , $"Invoke OnReceivedPackage length: {iterPackage.GetSize()}. Exception:\n{e.ToString()}"); } } } lock (m_BufferPool) { for (int iPackage = 0; iPackage < packageCount; iPackage++) { m_BufferPool.ReleaseBuffer(m_ReceivedPackages2[iPackage]); m_ReceivedPackages2[iPackage] = null; } } } }