【问题标题】:Socket Exception thrown on localhost, but not over network?在本地主机上抛出套接字异常,但不是通过网络?
【发布时间】:2014-09-17 19:10:02
【问题描述】:

我有一个客户端-服务器程序。这是客户端循环:

while ((msg = reader.readLine()) != null) {
                System.out.println(msg);
                //handle communication
            }
        } catch (Exception e) {
            e.printStackTrace();
            //handle server crash
        }

当我通过 localhost 连接时,一切正常:关闭服务器后,客户端出现异常。但是,一旦我通过本地网络连接并在另一台电脑上运行服务器,我就不会再遇到这种异常了,无论是我终止进程还是插入服务器电脑的电缆。这个怎么可能?我还尝试了一个检查 socket.isClosed() 的线程,但这也不起作用。我做错了什么,为什么它通过本地主机工作!?

【问题讨论】:

    标签: java sockets exception crash localhost


    【解决方案1】:

    TCP 的工作原理是,当连接空闲时,各方之间的连接状态不会经常同步。这是一个合乎逻辑的选择,因为同步是纯粹的流量开销。当你突然中断通讯渠道时,对方只是坐视不理。

    另一方面,当您在“本地主机”上时,这意味着您实际上是在环回适配器上,不需要通过线路进行同步。另一端会立即收到频道故障通知。

    【讨论】:

    • 啊,好的,谢谢。但是我注意到一个奇怪的事情是它可以在我的 Windows PC 上运行服务器,但是当我将它托管在我的 Raspberry PI 上时它就不起作用了。 (现在我使用 Android 应用程序对其进行了测试-> 通过本地网络使用真实手机连接到 windows pc 有效-我遇到了异常;连接到 RaspPI 没有)。还有其他方法可以让客户端收到有关服务器关闭的通知吗?
    • 通常服务器进程至少会做正常的 TCP 套接字清理,发送一个 RST 数据包。这应该足以让客户端注意到。
    • 有没有办法在 Java 中监听那个 RST 数据包?
    • AFAIK,如果您正在对 InputStream 或其派生词进行阻塞读取,一旦底层 I/O 层注意到数据包。
    • 我刚刚做了另一个测试:我更改了端口转发设置并在我的 Windows 电脑上运行了服务器。然后我通过我的应用程序用 3G 连接,当我关闭服务器时,它工作了。你知道为什么它不适用于 linux 服务器吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多