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); } }