2011-03-10 302 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