//异步接收操作完成时调用此方法 //如果远程主机关闭了连接,那么就关闭套接字 //接收到了数据,将数据返回给客户端 private void ProcessReceive(SocketAsyncEventArgs e) { AsyncUserToken token = (AsyncUserToken)e.UserToken; try { //检查这个远程主机是否关闭连接 if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { //使用MessageDeal类处理数据 //TODO 在有大量数据包发送过来时,因为忙着处理数据库,所以有数据没有接收到 //这里当数据大于8且不知道长度时,说明还有数据可以分析,那么就继续分析 //如果剩下的包足够长,那么数据就会被处理,不够长,那么下一次剩余数据到达,必然会调用一次这个函数,也能处理 do { MessageDeal.ReceiveDeal(e); }while (token.receiveBuffer.Count > 8 && token.packageLen == 0); //Thread thread = new Thread(()=>MessageDeal.ReceiveDeal(e)); //thread.Start(); //这里每一次接收到数据后,就会调用发送函数的回调函数 //那么后面服务端自己主动发送的时候,就需要自己主动调用了 if (token.sendPacketNum.Count() > 0) { //调用发送函数的回调函数 ProcessSend(sendSAEA); } //接收完继续接收 Console.WriteLine("开始异步接收"); token.isCopy = false; bool willRaiseEvent = token.Socket.ReceiveAsync(e); if (!willRaiseEvent) { ProcessReceive(e); } } else { CloseClientSocket(); } } catch (Exception xe) { Console.WriteLine(xe.Message + "\r\n" + xe.StackTrace); } }
//异步接收操作完成时调用此方法 //如果远程主机关闭了连接,那么就关闭套接字 //接收到了数据,将数据返回给客户端 private void ProcessReceive(SocketAsyncEventArgs e) { AsyncUserToken token = (AsyncUserToken)e.UserToken; try { //检查这个远程主机是否关闭连接 if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { //增加服务器接收到的总字数 Interlocked.Add(ref m_totalBytesRead, e.BytesTransferred); LogStringBuild.AppendFormat("The server has read a total of {0} bytes\n", m_totalBytesRead); LogString = LogStringBuild.ToString(); //处理数据 MessageDeal.ReceiveDeal(e); if (token.sendPacketNum.Count() > 0) { //调用发送函数的回调函数 ProcessSend(m_sendSaeaDic[token.Socket.RemoteEndPoint.ToString()]); } //将数据返回给客户端 //e.SetBuffer(e.Offset, e.BytesTransferred); //这里是从读取到发送 Console.WriteLine("开始异步接收"); bool willRaiseEvent = token.Socket.ReceiveAsync(e); if (!willRaiseEvent) { ProcessReceive(e); } } else { CloseClientSocket(e); } } catch (Exception xe) { Console.WriteLine(xe.Message + "\r\n" + xe.StackTrace); } }