2011-03-10 307 views
2

我有一个Java应用程序代理服务器和作为客户端的Android手机。他们通过TCP套接字进行通信。如何关闭TCP Keepalive?

我经常有客户端睡眠,当缓冲区填满时,我希望wifi无线电能够进入睡眠状态。问题是客户端没有睡觉。我注意到wireshark说我的服务器大约每半秒发送一个TCP KeepAlive数据包,所以无法睡觉。我已经在服务器和客户端上尝试了以下内容。

connectionSocket.setKeepAlive(false); 

但是这似乎没有改变。我正在使用wireshark来分析流量。这里是wireshark的屏幕截图...黑色线条表示我的客户端在哪里睡着,它的接收缓冲区已满。我能否阻止服务器发送keepAlive数据包?

谢谢!

+1

我看不到你的屏幕截图。 – secmask 2011-03-10 05:07:13

回答

1

TCP连接保持打开状态直到关闭,keep alive机制可以检测连接故障。

看看这个链接:Does a TCP socket connection have a "keep alive"?

+0

啊,根据你的链接中的一个人,它看起来好像没什么我可以做的。接下来的问题是802.11psm如何使无线电进入睡眠状态,如果有很多来自服务器的保活信息包......看起来第一个是在.5s之后发送,然后是1s,然后是2s。 。soem类指数函数,但它仍然需要几秒钟的时间才能达到数据包足够分开睡眠的地步。 – Michael 2011-03-10 04:52:41

+0

我认为你有两个选择,关闭连接并在发送缓冲区内容前重新打开它,或使用UDP(无连接)而不是TCP。这里是一个例子:http://www.java-samples.com/j2me/udp-datagram-free-j2me-sample-program.htm – 2011-03-10 20:42:56

+0

@JoelArnold,这个答案并不能解释为什么函数setKeepAlive(false)是不工作.. – Pacerier 2012-07-25 07:16:17