【问题标题】:Android tcp socket set etimedout valueAndroid tcp 套接字设置 etimedout 值
【发布时间】:2014-12-31 05:24:23
【问题描述】:

我在 android 上有 tcp 套接字客户端。此外,我在 nodejs 上有 tcp 套接字服务器,它每 2 秒向连接的客户端发送测试消息。当我启动应用程序时,它会从服务器接收测试消息。但是当我关闭 wi-fi 连接时,我的客户端套接字关闭并抛出 SocketException (etimedout),如果我打开 wi-fi 我无法接收服务器消息。但是服务器消息已经在服务器中排队等待发送给客户端。

据我所知,如果 tcp 客户端失去连接,它应该尝试修复连接并接收服务器消息。但就我而言,客户端无法接收消息,因为套接字已关闭。

在我的电脑上使用 windows 和 linux 套接字客户端,我正在做同样的事情,但是当我关闭 wi-fi 时,客户端套接字没有关闭,当我打开 wi-fi 时,我收到了已发送的消息,当 wi-fi 禁用时。

问题:为什么在 android 中,socket 会立即关闭?我可以设置任何超时关闭套接字客户端吗?

我试过了:

 setKeepAlive(true); setSoTimeout(10000);

尝试使用SocketFactory.getDefault().createSocket();

没有效果。

【问题讨论】:

  • 这可能是当你关闭 wifi 时,Android 实际上正在移除那个网络接口。比较在 Android 设备上关闭 wifi 与拔下它所连接的接入点之间的区别可能会很有趣。
  • 我试图拔掉接入点。结果相同。

标签: java android node.js sockets tcpsocket


【解决方案1】:

您的 SoLinger 设置为什么?

尝试使用

setSoLinger(boolean on, int timeout)

看看它是否对你的情况有帮助。

【讨论】:

  • 感谢您的回答。不幸的是,这没有帮助。接下来我从 SocketOptions.java 中找到了关于 SO_LINGER 的内容:“如果仍有一些缓冲数据要发送,则关闭套接字时要等待的秒数。”但这不是我需要的。我没有给服务器的消息,我只从 InputStream 中读取。
【解决方案2】:

但是当我关闭 wi-fi 连接时,我的客户端套接字关闭并且 抛出 SocketException

您的套接字没有关闭。 WiFi 关闭时,套接字输入流存在问题。它返回 -1,但套接字是活动的。

【讨论】:

    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2011-03-13
    • 2012-11-25
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多