while(client.read(rBuffer) > 0);

来源:7-9 NIO模型实现ChatClient_2

EverL

2019-09-09

第一:这里一直读不需要考虑rBuffer的size太小而读不下的情况么?

第二:client.read() 一次能读多少数据?rBuffer的大小?

写回答

1回答

Stannum

2019-09-17

同学你好~

每一次调用SocketChannel的read方法向buffer里面写数据时,最多只会从channel中读取buffer目前还可以存储的数据长度(注意,如果此时buffer中已经有数据的话,这个可存储长度是会小于buffer总长度的)。

所以如果channel中可读的数据长度超出了目前buffer的容量,那么while循环中继续调用read方法所返回的值就是0,于是while循环跳出。可是,这里返回0,并不是因为此时channel中没有数据可读,而是因为buffer已经满了。

但是,不要忘记,这时channel中还有可读的数据没读完呢。那么我们再一次调用selector的select方法时,会又一次收到这个channel的READ事件,于是我们客户端就会继续的读取channel中还没被读完的数据。

0
4
油腻!
但是,不要忘记,这时channel中还有可读的数据没读完呢。那么我们再一次调用selector的select方法时,会又一次收到这个channel的READ事件,于是我们客户端就会继续的读取channel中还没被读完的数据。 你这应该收不到 【channel的READ事件 】 了,因为你代码中循环完有 selectionKeys.clear();
2024-04-19
共4条回复

系统学习Java网络编程 深度理解BIO/NIO/AIO

对比式学习助你真正理解BIO/NIO/AIO三大网络编程模型。

880 学习 · 148 问题

查看课程