【发布时间】:2013-08-26 17:28:54
【问题描述】:
所以我有一个连接到外部网址的套接字,当它收到特定消息时应该断开连接。我试着打电话给socket.close(),但socket.isConnected() 仍然是真的。没有运气寻找答案
【问题讨论】:
标签: android sockets disconnect
所以我有一个连接到外部网址的套接字,当它收到特定消息时应该断开连接。我试着打电话给socket.close(),但socket.isConnected() 仍然是真的。没有运气寻找答案
【问题讨论】:
标签: android sockets disconnect
isConnected() 仅告诉您是否成功连接到套接字。 isClosed() 告诉你是否打电话给close()。
【讨论】:
close() 会关闭你的socket。但是,服务器不会收到您关闭套接字的通知。
" 当你使用 Socket() 时,你似乎忽略了这一点, Socket.isConnected() 告诉你 Socket.connect() 是否已经 叫与不叫。 isClosed() 和 close() 也是如此。
对这些方法的混淆是由于混淆了 套接字,它在应用程序的控制下,具有状态 整体连接,受协议控制。 isConnected() 和 isClosed() 告诉你对套接字做了什么。 除了读取和写入之外,没有其他 API 用于确定状态 的连接。”
Oracle documantion .close(),连接就会关闭,你可以通过isClosed()进行检查。
.close():
关闭此套接字。
当前在此套接字上的 I/O 操作中阻塞的任何线程都将 抛出一个 SocketException。
一旦套接字被关闭,它就不能再使用了 网络使用(即无法重新连接或反弹)。一个新的插座 需要创建。
【讨论】:
isConnected() 和isClosed() 告诉你当前套接字的状态(在你身边)。
isConnected() 告诉你 你 是否连接了这个套接字,isClosed() 告诉你 你 是否关闭了这个插座。直到你有,它返回 false。
【讨论】:
是的,没错。看来socket.close() 和socket.isConnected() 肯定是相互独立的。我希望方法命名不要那么混乱。
来自官方Android SDK:
public boolean isConnected()
返回套接字的连接状态。注意:关闭套接字并不会清除其连接状态,这意味着 对于关闭的套接字,此方法将返回 true
附:更直观的应该叫wasConnected()?
【讨论】:
http://developer.android.com/reference/java/net/Socket.html#close()
对返回的数据进行校验和,确保得到正确的值。如果是这样,并且您调用了 close 并尝试捕获所有内容,那应该没问题。
您可以在调试器中观察并确保没有泄漏。
【讨论】:
【讨论】: