【问题标题】:BufferedReader or Socket does not throw exception when telnet closestelnet 关闭时,BufferedReader 或 Socket 不抛出异常
【发布时间】:2012-05-04 07:14:34
【问题描述】:

我有一个问题,当 Telnet 客户端断开连接时没有抛出 IOException。

我使用了以下来源的服务器代码:

http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/Code/SocketThrdServer.java

根据给定的代码,当客户端关闭时,服务器应该终止并显示“读取失败”。但是 Telnet 或 Putty(RAW 连接)不会发生这种情况。相反,当我使用给出的示例客户端时,它可以正常工作。

我还尝试修改代码,以便 readLine() 不会总是阻塞 I/O,而是使用超时。但是,它似乎没有帮助检测客户端是否已断开连接。

    while (true) {
        try {
            client.setSoTimeout(1000);
            line = in.readLine();
            // Send data back to client
            out.println(line);
            textArea.append(line);

        } catch (SocketTimeoutException ex) {
            if(client.isClosed()) {
                System.out.println("Client disconnected");
                System.exit(-1);
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Read failed");
            System.exit(-1);
        }
    }

使用 Telnet 或 Raw Connection 是否缺少某些内容?

编辑:除此之外,当我运行 2 个客户端,然后关闭第一个客户端时,BufferedReader 不会抛出异常...

【问题讨论】:

    标签: java sockets bufferedreader


    【解决方案1】:

    如果是正常关机,应该没有 IO 异常。 in.readLine(); 在这种情况下应该返回 null,这是你的代码应该处理的情况。

    【讨论】:

    • 好的,我想这就是为什么。但是,我很好奇为什么优雅关闭不会将套接字状态设置为关闭?这使得 isClosed() 无效,因为套接字仍然认为它没有关闭......
    • 嗯,我不知道 isClosed() 到底是什么意思,但是 TCP 连接只有在 两端 都关闭了连接(或者一端重置了它,发送 TCP RST)。 TCP 连接可以处于半双工状态,其中一端已关闭其写入方向,但另一端仍可发送数据。
    • @Seeyabye TCP 中没有“拨号音”,因此除了尝试连接上的 I/O 之外,一个套接字无法知道另一端的套接字已关闭。 isClosed() 和朋友只告诉你你对自己的套接字做了什么,而不是连接发生了什么。
    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多