比如还是之前的那种消息格式
int类型的数(消息大小)消息 int类型的数 消息
50生产者|60如何处理|60如何处理
有两个地方可能会发生拆包
第一个地方是5 0
还有就是消息体生 产 者可能在不同包里发送过来
public long readFromReadableChannel(ReadableByteChannel channel) throws IOException {
int read = 0;
//size是一个四字节大小的内存空间
//如果size还有剩余的空间,那么就说明这个数还没有读取完整
if (size.hasRemaining()) {
//先读取4字节的数据(代表的就是后面跟着的消息体的大小)
int bytesRead = channel.read(size);
if (bytesRead < 0)
throw new EOFException();
read += bytesRead;
//一直要读取到size没有剩余空间了
//说明已经读取到一个4字节的int类型的数了
if (!size.hasRemaining()) {
size.rewind();
int receiveSize = size.getInt();
if (receiveSize < 0)
throw new InvalidReceiveException("Invalid receive (size = " + receiveSize + ")");
if (maxSize != UNLIMITED && receiveSize > maxSize)
throw new InvalidReceiveException("Invalid receive (size = " + receiveSize + " larger than " + maxSize + ")");
//分配一个内存空间,这个内存空间的大小
//就是刚刚读出来的那个4字节的int的大小
this.buffer = ByteBuffer.allocate(receiveSize);
}
}
这里解决了int数的拆包问题
public boolean complete() {
//size没有剩余空间了 && buffer没有剩余空间了
return !size.hasRemaining() && !buffer.hasRemaining();
}
这里第二个条件解决了消息体的拆包问题