【问题标题】:Java Socket class is lying regarding connection statusJava Socket 类在连接状态方面撒谎
【发布时间】:2010-11-23 00:11:36
【问题描述】:

我们有一个 Java 客户端,它保持与远程服务器的持久套接字连接。客户端每 15 秒轮询一次 DB 表,如果有新项目,则将其序列化并将其写入套接字。

在写入输出流之前,我想检查套接字连接是否仍然良好。对于特定的应用程序逻辑,进行这种主动检查比捕获异常并响应式重新连接更简单。

我使用以下代码找出了连接断开时哪种方法可以让我知道:

LOG.debug("Socket status: bound=" + _socket.isBound() + ", closed=" + _socket.isClosed() + ", connected=" + _socket.isConnected() + ", outputShutdown=" + _socket.isOutputShutdown() + ", inputShutdown=" + _socket.isOutputShutdown());

我暂时禁用了我的网络适配器,并且在下一次轮询期间,正如预期的那样,写入套接字时出现异常。

但是,调试语句打印了以下内容:

"Socket status: bound=true, closed=false, connected=true, outputShutdown=false, inputShutdown=false"

我希望关闭为真或连接为假。我得到的实际值似乎是谎言。

有没有办法可靠地检查套接字的连接状态?

【问题讨论】:

  • 不确定它是否与问题有关,但在示例代码中您检查了两次isOutputShutdown() 而根本没有检查isInputShutdown()
  • 它们不是谎言,你只是误解了它们。

标签: java sockets network-programming


【解决方案1】:

仔细阅读Socket class Javadoc

isConnected 如果套接字能够连接,则为真。方法名称用词不当,如果是 hasConnected 会更准确。

一旦套接字成功连接,它就变为真并保持真。 isBound 也一样。您必须尝试套接字操作并检查是否失败。

【讨论】:

    【解决方案2】:

    我对此不是 100% 确定,但我很确定底层 BSD 套接字 API 实际上没有确定 TCP 流是否仍然打开的机制; read()write() 失败是判断流已被拆除的一种非常可靠的方法。

    【讨论】:

      【解决方案3】:

      Elliot Rusty Harold 的 Java Network Programming 提供了以下精彩:

      "...判断一个socket当前是否打开,需要检查isConnected()返回true,isClosed()返回false。例如:

      boolean connected = socket.isConnected() && ! socket.isClosed();"
      

      希望这会有所帮助。

      【讨论】:

      • 这是一个很好的答案,但请记住,如果没有发送正确的 TCP 闭包,对等方可能会断开连接。这既不常见,也非常罕见。因此connected 可能为真,但下一个套接字操作将失败。因此你必须仍然有一些机制来处理失败,所以上面的行可能不会为你节省任何编码。
      • @GregS:你说得很对。我想知道为什么 Socket 的 API 的作者选择不提供方便的方法来帮助确定 Socket 是否已连接。同时回到你的答案!
      • 这是因为 TCP 无法提供答案。如果底层传输无法提供信息,那么构建在它之上的任何 API 都无法提供。
      • Elliotte Rusty Harolde 在这方面完全错了,而且他在这类方面通常不可靠。 isConnected() 告诉您是否曾经连接过 Socket。 isClosed() 告诉你是否曾经关闭它。它们都不会随着连接状态的变化而变化。它们都是关于socket,而不是connection。
      • @EJP 你是对的,这是错误的,也许,正确的答案是,由于 TCP 本身的限制,除了读取或写入尝试失败之外,无法判断。
      猜你喜欢
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 2014-01-21
      相关资源
      最近更新 更多