我们有一个 Java 客户端,它保持与远程服务器的持久套接字连接打开。客户端每 15 秒轮询一次数据库表,如果有新项目,它将序列化并将其写入套接字。
在写入输出流之前,我想检查套接字连接是否仍然良好。对于特定的应用程序逻辑,执行此主动检查比捕获异常并被动地重新连接更简单。
我使用以下代码找出哪种方法可以让我知道连接何时断开:
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"
我预计“close”为 true,“connected”为 false。我得到的实际值似乎是一个谎言。
有没有办法可靠地检查套接字的连接状态?
最佳答案
阅读Socket class Javadoc小心。
isConnected如果套接字能够连接,则为 true。方法名称用词不当,如果是 hasConnected 会更准确。
一旦套接字成功连接,它就会变为 true 并保持 true。 isBound 也是如此。您必须尝试套接字操作并检查是否失败。
关于Java Socket 类在连接状态方面撒谎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4251534/