5.7producer如何处理拆包问题

比如还是之前的那种消息格式

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

这里第二个条件解决了消息体的拆包问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值