Socket得到的InputStream,read方法的问题,我做的是客户端程序,主要功能是读取服务器端的内容,保存到客户端,简单代码如下:
try {
InputStream in = socket.getInputstream();
while (true) {
if (in.read() != -1 ){       // 1
//写服务器端过来的内容
}
}
}catch (IOException ex) {
//异常处理                  // 2
}
我的预想是:
//1 的地方我用来阻塞程序,等待socket的输入流 ,socket已经设置了超时。如果等待超时就跳到 //2 做异常处理。
实际运行是服务器端socket通信切断(也有可能是程序异常服务器端主动切断通信)时候,我这边并没有等待超时, //1 的地方也没有阻塞住 ,程序进入死循环(while) ,且 in.read() == -1。
这是什么原因,请高手指点下!!!!在线急等.

解决方案 »

  1.   

    flag=true;
    while(flag){
     --------------
    }catch(IOException ex)
    {
       flag=false;
       in.close();
    }
      

  2.   

    不是这个问题,本来服务器端切断后,in.read() 应该会catch 到异常的程序会跳出,但是现在问题服务器端间断后,in.read()没出超市异常,且 in.read() == -1 也就是读不到流!
      

  3.   

    服务器如果是正常的关闭连接,read是返回-1表示结束所以你代码应该是写成
    int ch;
    while((ch = is.read()) != -1) {
     // 处理
    }
    //服务器正常结束catch IOException表示有异常(例如你拨网线了)
      

  4.   

    http://inotgaoshou.iteye.com/blog/737936
      

  5.   

    这样也有个问题的啊,in.read()等于 -1 表示本次流数据到结尾了,通信还是没有切断的啊!! 假如网络不好,客户端在接完数据后,一直处于等待服务器数据,但又没有超时,也就是说在没有超时的时间里客户端输入流很有可能会再来数据,服务器端不停的发数据,不是说发完一段就结束了
      

  6.   

    流数据到结尾 即表示通信已经准备结束了,服务器已经发送了关闭信息到客户端了。如果只是读完服务器已经发出的数据,服务器暂时还没有发数据也没有发关闭命令的话,read方法是阻塞直到服务器发数据或者关闭命令为止(若设置了socket.setSoTimeout,则超时会抛异常)
      

  7.   

    我原来也是这么想的(read方法是阻塞直到服务器发数据),实际中发现中间有执行下去了 且 in.read() == -1
      

  8.   

    in.read() == -1 一定是服务器或客户端已经调用了关闭方法,否则是不可能的。