/// <summary>
        /// 当Socket上的发送或接收请求被完成时,调用此函数
        /// </summary>
        /// <param name="sender">激发事件的对象</param>
        /// <param name="e">与发送或接收完成操作相关联的SocketAsyncEventArg对象</param>
        private void OnIOCompleted(object sender, SocketAsyncEventArgs e)
        {
            // Determine which type of operation just completed and call the associated handler.
            AsyncUserToken userToken = e.UserToken as AsyncUserToken;

            lock (userToken)
            {
                switch (e.LastOperation)
                {
                case SocketAsyncOperation.Accept:
                    ProcessAccept(e);
                    break;

                case SocketAsyncOperation.Receive:
                    ProcessReceive(e);
                    break;
                    //case SocketAsyncOperation.Send:
                    //    ProcessSend(e);
                    //    break;
                }
            }
        }
        /// <summary>
        ///接收完成时处理函数
        /// </summary>
        /// <param name="e">与接收完成操作相关联的SocketAsyncEventArg对象</param>
        private void ProcessReceive(SocketAsyncEventArgs e)
        {
            AsyncUserToken userToken = e.UserToken as AsyncUserToken;

            if (userToken.ReceiveEventArgs.BytesTransferred > 0 && userToken.ReceiveEventArgs.SocketError == SocketError.Success)
            {
                Socket sock = userToken.ConnectSocket;
                //判断所有需接收的数据是否已经完成
                if (sock.Available == 0)
                {
                    //把收到的数据写入到缓存区里面
                    userToken.ReceiveBuffer.WriteBuffer(e.Buffer, e.Offset, e.BytesTransferred);
                    //TODO 处理数据

                    string info = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                    //Log4Debug(String.Format("收到 {0} 数据为 {1}", sock.RemoteEndPoint.ToString(), info));

                    Send(userToken.SendEventArgs, e.Buffer, e.BytesTransferred);
                }
                //TODO:Cannot access a disposed object.Object name: 'System.Net.Sockets.Socket'.
                try
                {
                    if (!sock.ReceiveAsync(userToken.ReceiveEventArgs))//为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件
                    {
                        //同步接收时处理接收完成事件
                        ProcessReceive(userToken.ReceiveEventArgs);
                    }
                }
                catch (ObjectDisposedException oex)
                {
                    Console.WriteLine("Client was closed:" + oex.Message);
                    CloseClientSocket(userToken);
                }
            }
            else
            {
                CloseClientSocket(userToken);
            }
        }