2012-11-03 153 views
0

我尝试使用读取超时解决服务器端的用户断开连接检测。 这是我的代码部分:Java套接字读取超时异常

try { 
     socket.setSoTimeout(3000); 
     in = new DataInputStream(socket.getInputStream()); 
     out = new DataOutputStream(socket.getOutputStream()); 
     usr = new User(in.readUTF()); 
     usr.connectUser(); 
     int i=0; 
     while(true){ 
      try{ 
       i = in.readInt(); 
      } 
      catch(SocketTimeoutException e){ 
       System.Out.Println("Timeout"); 
       // user connected, no data received 
      } 
      catch(EOFException e){ 
       System.Out.Println("Disconnected"); 
       // user disconnected 
      } 
     } 
    } 
    catch(Exception e){ 
     // other exceptions 
    } 

的代码工作正常除“用户断开连接”的问题。 我想赶上超时异常,只是继续等待数据 但只有当客户端仍然连接。 为什么我从来没有得到比SocketTimeoutException异常的其他异常? 不应该我得到IOException,而in.readInt()不能使用套接字,因为客户端断开连接?

有没有其他简单的方法来检测用户断开连接? 我的意思是不必要的断开,就像用户突然无线关机等...

谢谢, Lioz。

回答

0

如果客户端在超时期限内没有写入任何内容,则会出现SocketTimeoutException。如果他断开而不是写任何东西,你会得到一个EOFException。分别抓住他们。如果你没有收到EOFException,他没有断开连接。

+0

呃...这就是我认为......我唯一的例外是超时。我把2 println检查出来。我敢肯定,客户端断开连接...我的客户端是安卓手机,我关闭它的无线连接,以确保。任何其他想法? – HFDO5

+0

附加信息,如果我关闭客户端的套接字,我得到正确的例外...(我将println测试添加到代码中) – HFDO5

+0

@ HFDO5对等端必须调用close()才能收到EOS这段代码。只是关掉东西或拉电缆不这样做。这是超时例外存在的原因之一。 – EJP

相关问题