各位大哥,小弟我最近遇见一个解决不了的问题,恳请各位大哥们帮忙解决下,感激不尽。是一个关于NIO 通信的问题,Server 端在 LINUX上 client 端在windows 上,
ByteBuffer buffer = new ByteBuffer(8192);
while ((leng=SocketChannel.read(buffer))>0 ){
buffer.flip();
// 处理读到的内容
buffer.clear();
}
当client 发送大的请求报文时,
server 端会 接收不完全, leng = SocketChannel.read() 只能读到一段(比如请求报文大于2048左右时就只能读1400左右,小于2048时候就能一次读完),第二次 读时 leng就 等于0 了,跳出循环,不读了。buffer 设置了那么大,也不管用。
但是上面的代码在相同系统之间(windows和windows,linux和linux 之间跑就没有问题,buffer设置多大就读取多少)。
然后我做了改动:
ByteBuffer buffer = new ByteBuffer(8192);
while ((leng=SocketChannel.read(buffer))!=-1 ){
if(leng==0){
//就让他sleep 一会;然后继续读
continue;
}
buffer.flip();
// 处理读到的内容
buffer.clear();
}
同样也是先读取了1400长,然后leng 就等于0 了 ,然后很多次读取leng都等于0 ,多次等于0后,leng又>0 了,又读了一段内容出来,这样无限的读虽然能读完报文,但是却死循环了,会永远等于0 直到超时。
自我感觉是不同系统之间交互的问题,不然相同系统行,不同系统交互就不行了。
跪求各位大侠来解决下,谢谢!~
ByteBuffer buffer = new ByteBuffer(8192);
while ((leng=SocketChannel.read(buffer))>0 ){
buffer.flip();
// 处理读到的内容
buffer.clear();
}
当client 发送大的请求报文时,
server 端会 接收不完全, leng = SocketChannel.read() 只能读到一段(比如请求报文大于2048左右时就只能读1400左右,小于2048时候就能一次读完),第二次 读时 leng就 等于0 了,跳出循环,不读了。buffer 设置了那么大,也不管用。
但是上面的代码在相同系统之间(windows和windows,linux和linux 之间跑就没有问题,buffer设置多大就读取多少)。
然后我做了改动:
ByteBuffer buffer = new ByteBuffer(8192);
while ((leng=SocketChannel.read(buffer))!=-1 ){
if(leng==0){
//就让他sleep 一会;然后继续读
continue;
}
buffer.flip();
// 处理读到的内容
buffer.clear();
}
同样也是先读取了1400长,然后leng 就等于0 了 ,然后很多次读取leng都等于0 ,多次等于0后,leng又>0 了,又读了一段内容出来,这样无限的读虽然能读完报文,但是却死循环了,会永远等于0 直到超时。
自我感觉是不同系统之间交互的问题,不然相同系统行,不同系统交互就不行了。
跪求各位大侠来解决下,谢谢!~
对于非阻塞的nio,是有问题的nio就用nio的读取方法,等有可读时才读,而不是循环检查。