Java套接字读取超时异常

时间:2012-11-03 21:37:31

标签: java sockets client-server inputstream

我尝试使用读取超时来克服服务器端的用户断开连接检测。 这是我的代码的一部分:

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()不能使用套接字,因为客户端已断开连接?

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

感谢, Lioz。

1 个答案:

答案 0 :(得分:0)

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

相关问题