void OnSendCompleted(object sender, SocketAsyncEventArgs e)
 {
     //如果传输的数据量为0,则表示链接已经断开
     if (e.BytesTransferred == 0)
     {
         Client.Close();
     }
     else
     {
         if (DataSend != null)
         {
             AsyncConnectionEventArgs se = new AsyncConnectionEventArgs(e.Buffer, this);
             DataSend(this, se);
         }
         //通知数据发送完毕
         SendResetEvent.Set();
     }
 }
        /// <summary>
        /// 接收数据处理函数
        /// 1、将收到的数据包中的前4字节转换成Int32类型,作为本次数据包的长度。
        /// 2、将这个值设置成StateObject的RemainSize。
        /// 3、将数据包中剩下的数据写入StateObject的MemoryStream,并减少相应的RemainSize值。
        /// 4、直到RemainSize=0时,表示这一段数据已经接收完毕,从而重复1,开始下一段数据包的接收
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OnReceiveCompleted(object sender, SocketAsyncEventArgs e)
        {
            //如果传输的数据量为0,则表示链接已经断开
            if (e.BytesTransferred == 0)
            {
                Client.Close();
            }
            else
            {
                int position = 0;
                var c        = System.Text.Encoding.UTF8.GetString(e.Buffer, 0, e.Buffer.Length);
                while (position < e.BytesTransferred)
                {
                    if (State.RemainSize > 0)
                    {
                        int bytesToRead = State.RemainSize > e.BytesTransferred - position ?
                                          e.BytesTransferred - position : State.RemainSize;
                        State.RemainSize -= bytesToRead;
                        State.Stream.Write(State.Buffer, position, bytesToRead);
                        position += bytesToRead;

                        if (State.RemainSize == 0)
                        {
                            if (DataRecieved != null)
                            {
                                AsyncConnectionEventArgs ce =
                                    new AsyncConnectionEventArgs(State.Stream.ToArray(), this);
                                DataRecieved(this, ce);
                            }
                            State.Stream.Dispose();
                        }
                    }
                    else
                    {
                        State.RemainSize = BitConverter.ToInt32(State.Buffer, position);
                        State.Stream     = new MemoryStream(State.RemainSize);
                        position        += 4;
                    }
                }
                //重新设置数据缓存区
                e.SetBuffer(State.Buffer, 0, State.Buffer.Length);
                Client.ReceiveAsync(e);
            }
        }