Java Socket类关于连接状态

时间:2010-11-23 00:11:36

标签: java sockets network-programming

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

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

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

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"

我预计要么关闭要么为真,要么连接为假。我得到的实际价值似乎是一个谎言。

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

3 个答案:

答案 0 :(得分:6)

仔细阅读Socket class Javadoc

如果套接字能够连接,则

isConnected为真。方法名称用词不当,如果它是 hasConnected 则更准确。

套接字成功连接后,它将变为真,并保持为真。 isBound也是如此。您必须尝试套接字操作并检查是否失败。

答案 1 :(得分:2)

我不是百分之百确定这一点,但我很确定底层BSD套接字API实际上没有一种机制来确定TCP流是否仍然是开放的; read()write()失败是一种非常可靠的方式来判断流已被拆除。

答案 2 :(得分:1)

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

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

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

希望这有帮助。