【问题标题】:Java socket read timeout exceptionsJava 套接字读取超时异常
【发布时间】:2012-10-24 04:56:09
【问题描述】:

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

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 我从来没有遇到过其他异常? 我不应该在 in.readInt() 因为客户端断开连接而无法使用套接字时得到 IOException 吗?

还有其他简单的方法来检测用户断开连接吗? 我的意思是不必要的断开连接,例如用户突然关闭 wifi 等...

谢谢, 利奥兹。

【问题讨论】:

    标签: java sockets client-server inputstream


    【解决方案1】:

    如果客户端在超时时间内没有写任何东西,你会得到一个 SocketTimeoutException。如果他断开连接而不是写任何东西,你会得到一个 EOFException。分别抓住它们。如果您没有收到 EOFException,则说明他没有断开连接。

    【讨论】:

    • 嗯......这就是我的想法......我得到的唯一例外是超时。我放了 2 个 println 来检查一下。而且我确定客户端已断开连接...我的客户端是android手机,我确定它的wifi连接已关闭。还有其他想法吗?
    • 附加信息,如果我从客户端关闭套接字,我会得到正确的异常...(我在代码中添加了 println 测试)
    • @HFDO5 节点必须调用 close() 才能通过此代码接收 EOS。只是关掉东西或拉电缆并不能做到这一点。这就是存在超时异常的原因之一。
    • 当然,但是如果有读取调用并且没有连接,我应该得到其他异常而不是超时。我想...
    • @HFDO5 你可以想你所想,但实际情况如我上面所说。
    猜你喜欢
    • 2012-09-06
    • 2017-03-19
    • 1970-01-01
    • 2013-05-16
    • 2019-10-21
    • 2011-10-03
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多