Ejemplo n.º 1
0
        //异步接收操作完成时调用此方法
        //如果远程主机关闭了连接,那么就关闭套接字
        //接收到了数据,将数据返回给客户端
        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);
            }
        }
Ejemplo n.º 2
0
        //异步接收操作完成时调用此方法
        //如果远程主机关闭了连接,那么就关闭套接字
        //接收到了数据,将数据返回给客户端
        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);
            }
        }