所以我有一个连接到外部网址的套接字,当它收到某个消息时,它应该断开连接。我试过打电话socket.close()
,但socket.isConnected()
仍然是真的。没有运气寻找答案
6 回答
isConnected()
仅告诉您是否成功连接到套接字。isClosed()
告诉你,如果你打电话close()
。
" 当你使用 Socket() 时,你似乎忽略了它,Socket.isConnected() 会告诉你 Socket.connect() 是否已被调用。isClosed() 和 close() 也是如此。
对这些方法的混淆是由于混淆了受应用程序控制的套接字状态与受协议控制的整个连接的状态。isConnected() 和 isClosed() 告诉你对套接字做了什么。除了读取和写入之外,没有其他 API 可用于确定连接的状态。”
Oracle 文档< 在这里很好地解释了,一旦你调用.close()
连接就关闭了,你可以通过isClosed()
.
.close():
关闭此套接字。
当前在此套接字上的 I/O 操作中阻塞的任何线程都将抛出 SocketException。
一旦套接字被关闭,它就不能用于进一步的网络使用(即不能重新连接或重新连接)。需要创建一个新的套接字。
是的,没错。它肯定看起来socket.close()
并且socket.isConnected()
彼此独立。我希望方法命名不要那么混乱。
来自官方Android SDK:
public boolean isConnected()
返回套接字的连接状态。注意:关闭套接字并不会清除其连接状态,这意味着此方法将为关闭的套接字返回 true
PS更直观的应该叫wasConnected()
isConnected()
并isClosed()
告诉您套接字的当前状态(在您身边)。
isConnected()
告诉你是否连接了这个socket,isClosed()
告诉你是否关闭了这个socket。在你拥有之前,它会返回 false。
http://developer.android.com/reference/java/net/Socket.html#close()
对返回的数据进行校验和,确保获得正确的值。如果是这样,并且您调用了 close 并尝试捕获所有内容,那应该没问题。
您可以在调试器中观察并确保没有泄漏。