首页 文章

Java Socket类关于连接状态

提问于
浏览
0

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

在写入输出流之前,我想检查套接字连接是否仍然良好 . 对于特定的应用程序逻辑,执行此主动检查比捕获异常和重新连接更为简单 .

我使用下面的代码弄清楚当连接断开时哪种方法可以让我知道:

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

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

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

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

我希望关闭是真实的或连接是假的 . 我得到的实际 Value 似乎是一个谎言 .

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

3 回答

  • 2

    Elliot的Java网络编程Rusty Harold提供以下gem:

    “...要判断套接字当前是否打开,您需要检查isConnected()是否返回true并且isClosed()返回false . 例如:

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

    希望这可以帮助 .

  • 6

    仔细阅读Socket class Javadoc .

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

    一旦套接字成功连接,它就变为真实并保持正确 . isBound也是如此 . 您必须尝试套接字操作并检查是否有故障 .

  • 1

    我非常确定底层BSD套接字API实际上没有一种机制来确定TCP流是否仍然是开放的;有一个 read()write() 失败是一个非常可靠的方式来告诉流已被拆除 .

相关问题