关于从 IoArgs 向 byte 中写入的问题

来源:8-6 构建有序消息体-基本发送调度实现

磊磊要酷酷滴

2019-04-21

  • bytes.length - offset:byte 中能够被写入的大小;
  • buffer.remaining():buffer 中剩余的空间;
  • 这俩有什么好比的呢?不应该是 bytes.length - offset 和 buffer 中实际占用的大小比吗?这点有些想不明白,还请老师指点迷津。
public int writeTo(byte[] bytes, int offset) {
        int size = Math.min(bytes.length - offset, buffer.remaining());
        buffer.get(bytes, offset, size);
        return size;
}
写回答

2回答

Qiujuer

2019-04-21

  • bytes.length - offset:byte 中能够被写入的大小;

  • buffer.remaining():buffer 中剩余的空间;


这两句解释都没错。对于往buffer中写入来说这样的解释没错。

对于从buffer中读取来说就有点儿问题:buffer.remaining() 此时表示的是buffer中还剩余的字节数量。


比如:buffer有10个字节,已经被读取一个,所以剩余就是9个。
bytes总共有10个字节,此时已经存储了4个进去了,还剩余6个可以被写入的区间。

所以我一次就只能读取:Math.min(6, 9); = 6.

1
4
Qiujuer
回复
磊磊要酷酷滴
不客气哈
2019-04-23
共4条回复

none_nkn

2020-06-20

这里offset传入的固定是0,bytes是AsyncReceiveDispatcher中的buffer,length实际上是消息体的长度。因此这里bytes.length-offset对应每次接收一个IoArgs为StringReceivePacket都是固定为消息体长度。当消息体长度小于等于IoArgs的buffer剩余空间[position,limit],则只需读取消息体长度个字节,读取一次IoArgs即可得到完整消息。当消息体长度大于IoArgs的buffer的剩余空间,则只读取剩余空间长度个字节,读取多份IoArgs才可得到完整消息。bytes总是从0(offset)开始存储字节。以上是我个人的理解。

0
0

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

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

2319 学习 · 476 问题

查看课程