采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
public int writeTo(byte[] bytes, int offset) { int size = Math.min(bytes.length - offset, buffer.remaining()); buffer.get(bytes, offset, size); return size; }
bytes.length - offset:byte 中能够被写入的大小;
buffer.remaining():buffer 中剩余的空间;
这两句解释都没错。对于往buffer中写入来说这样的解释没错。
对于从buffer中读取来说就有点儿问题:buffer.remaining() 此时表示的是buffer中还剩余的字节数量。
比如:buffer有10个字节,已经被读取一个,所以剩余就是9个。bytes总共有10个字节,此时已经存储了4个进去了,还剩余6个可以被写入的区间。所以我一次就只能读取:Math.min(6, 9); = 6.
谢谢老师,我明白了,buffer.remaining() 在读和写的时候表示的意义是不同的,可是为什么会这样呢?好神奇呀!
其实内部原理都一样 只是解释意思不同而已。 准确来说就是剩余可操作区间大小
哦!懂了!读的时候,position 和 limit 会分别处于有数据区的左右,两者间距离代表的就是数据实际数量。老师之前讲过buffer的结构,这会理解的更深刻了,谢谢老师的耐心讲解,老师早点休息^_^
这里offset传入的固定是0,bytes是AsyncReceiveDispatcher中的buffer,length实际上是消息体的长度。因此这里bytes.length-offset对应每次接收一个IoArgs为StringReceivePacket都是固定为消息体长度。当消息体长度小于等于IoArgs的buffer剩余空间[position,limit],则只需读取消息体长度个字节,读取一次IoArgs即可得到完整消息。当消息体长度大于IoArgs的buffer的剩余空间,则只读取剩余空间长度个字节,读取多份IoArgs才可得到完整消息。bytes总是从0(offset)开始存储字节。以上是我个人的理解。
登录后可查看更多问答,登录/注册
理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选
2.8k 1
1.8k 7
1.7k 5
1.9k 13
1.1k 13