我们的程序读Socket数据,发现当服务器端发送大于一定字节的数据时,客户端代码总是读不全数据,很急,请大家帮看看。小数据时候没有问题。大数据也不是特别的大就几十K .protected static byte[] readInputStream(InputStream _in) throws IOException {
byte data[] = null;
if(_in==null)
throw new IOException("InputStream can't be null!");

int s = _in.read();
if(s==-1) {
return null; //Connection lost
}
int alength = _in.available();

if(alength > 0) {
data = new byte[alength+1];
_in.read(data, 1, alength);
} else {
data = new byte[1];
}
data[0] = (byte)s;
return data;
}

解决方案 »

  1.   

    从你的代码看 你只读了一次
    而且没有结束校验建议你设置成带有结束符号的 如 123#END收到 #END时才认为读取完全了否则 不断的重试 直到超时@_@
      

  2.   

    谢谢
    但是我用 int alength = _in.available(); 得到了所有的字节阿
      

  3.   

    在给你回答一次:
    _in.available();返回的只是可以不受阻塞地从此输入流读取(或跳过)的字节数,并不一定是服务端所写入全部数据(数据量大时可能小于,当然数据量较少是两者有可能相等)
    可用如下方法:
    int len;
    while((len=_in.read(data))!=-1){
       //相关的处理
    }
      

  4.   

    这个方法我用了,但是发现读几次之后 read 方法不返回值任何值,阻塞住了。为什么呢
      

  5.   

    找到问题原因了 是输出流的 flush 方法没有刷新缓冲区,但是用socket.close() 客户端流的read 方法就不堵塞了,而且还能读全数据。 这是为什么呢? 也不能每次都close 。
      

  6.   

    flush 对用带有缓存的流有效 
    LZ用的不是带缓存的吧?