private void OnReceive(IAsyncResult result) { try { int bytesReceived = this.socket.EndReceive(result); if (bytesReceived == 0) { this.State = ConnectionState.Disconnected; return; } //拷贝到缓存队列 for (int i = 0; i < bytesReceived; i++) { AllDatas.Add(buffer[i]); } //===解析数据=== int len = 0, command = 0; do { if (AllDatas.Count > 7) //最小的包应该有8个字节 { NetHelp.BytesToInt(AllDatas, 0, ref len); //读取消息体的长度 len += 4; //读取消息体内容 if (len <= AllDatas.Count) { NetHelp.BytesToInt(AllDatas, 4, ref command);//操作命令 byte[] msgBytes = new byte[len - 8]; AllDatas.CopyTo(8, msgBytes, 0, msgBytes.Length); AllDatas.RemoveRange(0, len); Handlers.Handle(this, command, msgBytes); } else { break; } } else { break; } } while (true); this.BeginReceive(); } catch (SocketException ex) { Debug.LogException(ex); } catch (Exception ex) { Debug.LogException(ex); } }
/// <summary> ///接收完成时处理函数 /// </summary> /// <param name="e">与接收完成操作相关联的SocketAsyncEventArg对象</param> private void ProcessReceive() { // 检查远程主机是否关闭连接 if (asyn.BytesTransferred > 0) { if (asyn.SocketError == SocketError.Success) { //判断所有需接收的数据是否已经完成 if (socket.Available == 0) { //获取接收到的数据 //byte[] ByteArray = new byte[asyn.BytesTransferred]; //Array.Copy(asyn.Buffer, 0, ByteArray, 0, ByteArray.Length); //拷贝到缓存队列 for (int i = 0; i < asyn.BytesTransferred; i++) { AllDatas.Add(asyn.Buffer[i]); } //===解析数据=== int len = 0, command = 0; do { if (AllDatas.Count > 7) //最小的包应该有8个字节 { NetHelp.BytesToInt(AllDatas, 0, ref len); //读取消息体的长度 len += 4; //读取消息体内容 if (len <= AllDatas.Count) { NetHelp.BytesToInt(AllDatas, 4, ref command);//操作命令 byte[] msgBytes = new byte[len - 8]; AllDatas.CopyTo(8, msgBytes, 0, msgBytes.Length); AllDatas.RemoveRange(0, len); Handle(this, command, msgBytes); } else { break; } } else { break; } } while (true); } else if (!socket.ReceiveAsync(asyn)) //为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件 { // 同步接收时处理接收完成事件 this.ProcessReceive(); } } else { this.ProcessError(); } } else { CloseSocket(this); } }