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中还没被读完的数据。
042024-04-19
相似问题