/// <summary> /// 解析数据 处理沾包 /// </summary> public void RecvBuffer(byte[] buffer, int length) { //塞不下了 扩容 拷贝数据 if (_recvBuffOffset + length > _recvBuffers.Length) { byte[] oldRecvBuff = _recvBuffers; _recvBuffers = new byte[_recvBuffers.Length + length]; Array.Copy(oldRecvBuff, 0, _recvBuffers, 0, _recvBuffOffset); } Array.Copy(buffer, 0, _recvBuffers, _recvBuffOffset, length); _recvBuffOffset += length; while (true) { // 还没包头大就算了吧 if (_recvBuffOffset < NetDefine.PACKET_HEAD_LEN) { break; } if (_packetLength <= 0) { _packetLength = BitConverter.ToInt16(_recvBuffers, NetDefine.PACKET_HEAD_LEN - NetDefine.PACKET_LENGTH_BITS); _packetLength = System.Net.IPAddress.NetworkToHostOrder(_packetLength); //转换到服务器端 大端 _packetLength += NetDefine.PACKET_HEAD_LEN; } //读取了一个包的数据量了 if (_packetLength > 0 && _recvBuffOffset >= _packetLength) { short packId = BitConverter.ToInt16(_recvBuffers, NetDefine.TCP_HEADER_BITS); packId = System.Net.IPAddress.NetworkToHostOrder(packId); byte[] tempBytes = new byte[_packetLength - NetDefine.PACKET_HEAD_LEN]; //把数据存出来 Array.Copy(_recvBuffers, NetDefine.PACKET_HEAD_LEN, tempBytes, 0, _recvBuffOffset - NetDefine.PACKET_HEAD_LEN); //解出来一个包 _packetParser.Parser(packId, tempBytes); //沾包了 int offset = _recvBuffOffset - _packetLength; if (offset > 0) { Array.Copy(_recvBuffers, _packetLength, _recvBuffers, 0, offset); } _recvBuffOffset = offset; _packetLength = 0; } else { break; } } }