各位大哥,小弟我最近遇见一个解决不了的问题,恳请各位大哥们帮忙解决下,感激不尽。是一个关于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 直到超时。
自我感觉是不同系统之间交互的问题,不然相同系统行,不同系统交互就不行了。
  跪求各位大侠来解决下,谢谢!~

解决方案 »

  1.   

    首先我要问你一下,你发送内容是字节,还是字符串啊,不同的系统间最好以字节发送。你可以把buffer改小试试,
      

  2.   

    看看发送过来的是字符串,还是字节,,,字符串与字节的读法不一样,byte [] bytes = new byte[2048];
      

  3.   

    你这代码看上去不像是 NIO 的啊?我连个 Selector 都没看到。
      

  4.   

    这个是 NIO 的读取方式,其他的没列出来,对于延时很多毫秒后才能读到数据该怎样去解决呢
      

  5.   

    循环读取,是属于传统阻塞型io的经典用法
    对于非阻塞的nio,是有问题的nio就用nio的读取方法,等有可读时才读,而不是循环检查。