我做了个多线程的服务器程序 线程中等待客户端的消息 部分代码如下:
  
    boolean done=clientRequest.isConnected();//判断客户端Socket是否连接
    
    while(done)//客户端是连接的
    {
         try 
{
    input = clientRequest.getInputStream();
    Binput = new BufferedInputStream(input);
    str = "" + Binput.read();
             if(Binput.read()!= -1)//如果客户端有消息就打印出来
   {
System.out.println(str);
             }          }
          catch (IOException e)
{
    e.printStackTrace();
}
 
         if(clientRequest.isclosed())//判断Socket是否关闭
{
   done=false;//如果关闭,就跳出无限循环(while)
}
    }    我的代码能实现服务器与客户端的通信
    问题是: 当客户端中断或退出  以上代码却不能判断Socket中断 跳不出while的无限循环
    请哪位大侠指点一二  小弟不慎感激......

解决方案 »

  1.   

    catch (IOException e) 

        e.printStackTrace(); 
    } 在这里改成
    catch (Exception e) {
    break;
    }
    试试
      

  2.   

    还是不行  当客户端断了后  服务器站cup 100%   
      

  3.   

    客户端发送关闭消息告诉服务器客户端要关了,
    关闭消息自己定义,比如发送个close字符串,表示客户端要关闭连接,服务器解析到这个字符串,就跳出循环,结束连接。
      

  4.   

    如果不行的话,可以用heartbeat 来保活连接
    如果得不到心跳包就是连接丢失了......
      

  5.   

    以上方法都是没用的!
    try {
    socket.sendUrgentData(0);
    } catch (IOException e) {
            //如果抛出了异常,那么就是断开连接了

    }
      

  6.   

    抛异常或者从客户端的输入流里读出的是null, 这时就说明客户端已经断开.
    一般情况下, 客户端断开都能读到一个null.
      

  7.   

    try { 
    socket.sendUrgentData(0); 
    } catch (IOException e) { 
            //如果抛出了异常,那么就是断开连接了 }就是所谓的心跳测试,但是在本人实践中,发现它并不总是凑效。 有时候明明测试过了,但是就是发不出数据,也读不到,最终time out.
      

  8.   

    设置延迟断开,这需要拥有监控线程。曾经很多人利用这种特性攻击过HTTP服务器,后来用延迟断开解决这个问题的。
      

  9.   

    if(Binput.read()!= -1)//如果客户端有消息就打印出来 这句返回 0 和 -1 类似意思不一样,你试试看。
      

  10.   

    +
    try { 
    socket.sendUrgentData(0); 
    } catch (IOException e) { 
            //如果抛出了异常,那么就是断开连接了 } 
      

  11.   

    谢谢各位 大侠的回复  我搞定了  总结一下:
    1.  while(Binput.read()!= -1)  这种方法 能判断出客户端输入是否为空  客户端断开 能跳出死循环
                                       但是 我想得到的数据却从第二个开始了 所以这方法不适宜2. 用下面的方法就没问题了  在死循环中加入以下代码 
    try { 
    socket.sendUrgentData(0); 
    } catch (IOException e) { 
         done= false;    //如果抛出了异常,那么就是断开连接了  跳出无限循环
    } 10楼 16楼说的没错  12楼说的情况我暂时没有遇到 
    谢谢  散分...
      

  12.   

    貌似还是有问题啊 就是开始用 teinet命令去连接我的服务器 然后关闭dos命令窗口 代码能跳出无限循环 
    但是我去关闭我的设备时 就没什反应 我再次连上设备后 Java出错信息是:
    java.net.SocketException: Connection reset
    麻烦给点意见
      

  13.   

    catch (Exception e) { 
    System.out.println("客户机:"+socket.get忘记了+"离开了");
    return;
      

  14.   

    while(true) {
     try{
       in.read();
     }
     catch(Exception e) {
       in.close();
       socket.close();
       break;
     }
    }我都这样写,没遇到什么问题!
      

  15.   


    如果是这样的话,你就不要判断那个网络设备断来了,因为当网络设备断开时候是没有消息发送给服务器的,而此时服务器正等待网络设备发送。当网络设备第二次连接上来时候,服务器就会抛异常,原因是已经不是第一次的网络连接了,所以你需要做的,当收到上面那个异常后,就重新启动一个新的socket(由于我问的第二点,无论先启动哪个都能正常连接,所以这样做是可以的)
      

  16.   

    进了循环体以后如果断了,isConnected判断就判不出来了,只能下次开始循环的时候检查,还是拿报错来判断的好。代码没细看。还有什么问题再问吧。
      

  17.   

    23楼 没有别的办法了吗?  重新开个Socket  那是不是要重新开线程啊?  那我怎么跳回到线程的开始呢?24楼 问题是捕获不到断开时的报错啊
      

  18.   

    捕获的应该是流获取不到的错。运行的时候最长的时间应该是阻塞在从流里获取数据的地方,断开的时候程序一般也都停在这里,监听这里就行了,我自己做过这样的东西,就是这么处理的,isConnected基本没用。
      

  19.   

    很简单,加一个读取Buffer的函数read,这是个阻塞函数,用 cSocket.setSoTimeout(2000)来设定其超时时间,抛出错误,判断其返回值,如果返回值不大于0,则表示客户端已经断开。
      

  20.   

    read 读到 -1 时,客户端就关掉了