2014-11-04 163 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