在 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(当多个选项卡时)?

导航到不同屏幕时如何断开套接字

如何在socket.io中的断开事件上获取断开连接的客户端的套接字ID

如何判断套接字是不是已断开连接(Java)[重复]

如何检测 TCP 套接字断开连接(使用 C Berkeley 套接字)