AsyncReceiveDispatcher中buffer空间的疑惑

来源:8-9 消息粘包与消息不全测试

等待灬

2018-12-28

/**
 * 解析数据到Packet
 */
private void assemblePacket(IoArgs args) {
    if (packetTemp == null) {
        int length = args.readLength();
        packetTemp = new StringReceivePacket(length);
        buffer = new byte[length];
        total = length;
        position = 0;
    }

    int count = args.writeTo(buffer, 0);
    if (count > 0) {
        packetTemp.save(buffer, count);
        position += count;

        // 检查是否已完成一份Packet接收
        if (position == total) {
            completePacket();
            packetTemp = null;
        }
    }
}

buffer = new byte[length];老师,这一步,就是消息第一次进来packetTemp为空,此时要初始化packetTemp,当前dispatcher中的buffer的length其实是可以设置为args的capacity的吧,

因为假如我消息的长度为50,args的capacity为5,每一次执行这个int count = args.writeTo(buffer, 0)其实也就能写进去5个长度的数据,也就是args的capacity限制了,但是buffer的长度设置的是50,其实buffer后面空间每次都空的,因为packetTemp.save(buffer, count);的时候也是从buffer的0下标开始读去save的

写回答

2回答

Qiujuer

2018-12-28

Yes Yes~~ 是这样的哈~~ 学到了哈~~;在你的这个调度中buffer的长度只需要是args的容量即可.

0
5
Qiujuer
回复
蓝胖子的编程梦
没啥好办法,只能强撑;然后调试跟踪一下
2019-07-13
共5条回复

等待灬

提问者

2018-12-28

我试了一下好像没什么问题,就是不知道我想的对不对,有没有隐患

0
0

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2316 学习 · 476 问题

查看课程