繁体   English   中英

Java Socket类说谎关于连接状态

[英]Java Socket class is lying regarding connection status

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

我期望关闭要么为真,要么为假。 我得到的实际价值似乎是个谎言。

有没有一种方法可以可靠地检查套接字的连接状态?

仔细阅读Socket类Javadoc

如果套接字能够连接,则isConnected为true。 方法名称是错误的名称,如果它具有hasConnected ,它将更准确。

一旦套接字成功连接,它将变为true并保持为true。 对于isBound同样如此。 您必须尝试执行套接字操作并检查是否失败。

我对此不是100%的确定,但是我可以肯定,底层的BSD套接字API实际上没有确定TCP流是否仍处于打开状态的机制。 read()write()失败是一种非常可靠的方式来告知流已被拆除。

Elliot Rusty Harold撰写的Java Network Programming提供了以下宝石:

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

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

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM