/// <summary> /// 开始接收 /// </summary> /// <param name="stream">Socket网络流</param> /// <param name="callback">回调函数</param> /// <param name="state">自定义状态</param> /// <returns>异步结果</returns> public IAsyncResult BeginReceive(Stream stream, AsyncCallback callback, object state) { //stream不能为null if (stream == null) { throw new ArgumentNullException(nameof(stream)); } //回调函数不能为null if (callback == null) { throw new ArgumentNullException(nameof(callback)); } //stream异常 if (!stream.CanRead) { throw new ArgumentException("stream不支持读取。"); } SocketAsyncResult result = new SocketAsyncResult(state); //初始化SocketHandlerState SocketHandlerState shs = new SocketHandlerState { Data = new byte[2], AsyncResult = result, Stream = stream, AsyncCallBack = callback, Completed = true }; //开始异步接收长度为2的头信息 //该头信息包含要接收的主要数据长度 stream.BeginRead(shs.Data, 0, 2, EndRead, shs); return(result); }
/// <summary> /// 开始发送 /// </summary> /// <param name="data">要发送的数据</param> /// <param name="offset">数据偏移</param> /// <param name="count">发送长度</param> /// <param name="stream">Socket网络流</param> /// <param name="callback">回调函数</param> /// <param name="state">自定义状态</param> /// <returns>异步结果</returns> public IAsyncResult BeginSend(byte[] data, int offset, int count, Stream stream, AsyncCallback callback, object state) { //data不能为null if (data == null) { throw new ArgumentNullException(nameof(data)); } //offset不能小于0和超过data长度 if (offset > data.Length || offset < 0) { throw new ArgumentOutOfRangeException(nameof(offset)); } //count不能大于65535 if (count <= 0 || count > data.Length - offset || count > ushort.MaxValue) { throw new ArgumentOutOfRangeException(nameof(count)); } //stream不能为null if (stream == null) { throw new ArgumentNullException(nameof(stream)); } //回调函数不能为null if (callback == null) { throw new ArgumentNullException(nameof(callback)); } //stream异常 if (!stream.CanWrite) { throw new ArgumentException("stream不支持写入。"); } SocketAsyncResult result = new SocketAsyncResult(state); //初始化SocketHandlerState SocketHandlerState shs = new SocketHandlerState { Data = data, AsyncResult = result, Stream = stream, AsyncCallBack = callback, DataLength = 0 }; //锁定SendQueue //避免多线程同时发送数据 lock (SendQueue) { //添加状态 SendQueue.Add(shs); //如果SendQueue数量大于1,则表示有数据尚未发送完成 if (SendQueue.Count > 1) { return(result); } } //获取数据长度 //ushort的最大值为65535 //转换为byte[]长度为2 var dataLength = BitConverter.GetBytes((ushort)data.Length); //向对方发送长度为2的头信息,表示接下来要发送的数据长度 stream.Write(dataLength, 0, dataLength.Length); //开始异步发送数据 stream.BeginWrite(shs.Data, 0, shs.Data.Length, EndWrite, shs).AsyncWaitHandle.WaitOne(); return(result); }