2014-11-04 77 views
2

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

据我所知,如果tcp客户端丢失连接,它应该尝试修复连接并接收服务器消息。但在我的情况下,客户端无法接收消息,因为套接字关闭。在我的电脑上使用Windows和Linux套接字客户端时,我做的是同样的事情,但是当我关闭wi-fi时,客户端套接字未关闭,并且当我切换wi-fi时,我收到了消息当wi-fi禁用时发送。

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

我想:

setKeepAlive(true); setSoTimeout(10000); 

尽量选用SocketFactory.getDefault().createSocket();

无影响。

+0

这可能是因为当你关闭wifi时,Android实际上正在移除该网络接口。比较关闭Android设备上的WiFi与拔掉它所连接的接入点之间的区别可能很有趣。 – 2014-11-04 17:04:01

+0

我试图拔掉接入点。同样的结果。 – Vusal 2014-11-14 21:16:11

回答

0

但是,当我关掉Wi-Fi连接,我的客户套接字关闭, 抛出SocketException

您的插座不紧密。当WiFi关闭时,套接字输入流存在问题。它返回-1,但套接字是活着的。

0

你的SoLinger设置为?

尝试使用

,看它是否有助于你的情况。

+0

感谢您的回答。不幸的是,这并没有帮助。接下来我从SocketOptions.java中找到关于SO_LINGER的内容:“如果还有一些要发送的缓冲数据,关闭套接字时等待的秒数”。但这不是我所需要的。我没有给服务器的消息,我只从InputStream读取。 – Vusal 2014-11-04 12:28:43