Java Socket 类在连接状态方面撒谎

标签 java sockets network-programming

我们有一个 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/

相关文章:

java - 如何静默编译Java文件除非出现错误?

java - 在 main 上序列化泛型类型

java - 正则表达式删除除特定格式之外的所有内容

sockets - 浏览器上的 GCDAsyncSocket 连接并立即断开连接,出现 "Socket closed by remote peer"错误

c - 如何在混杂模式下打开原始 UDP 套接字?

java - 与 KeyListener 并行运行的方法

java - Hibernate @Where 子句

linux - bind() 选择零端口

c++ - 使用本地 ipv6 套接字将 UDP 发送到本地 ipv4 地址

c - 我需要遍历 getaddrinfo() 吗?