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