2015-09-13 60 views
0

我寫了一個簡單的網絡引擎用於客戶端 - 服務器通信。它在Windows上完美工作,服務器知道客戶端何時斷開連接等。(readLine()拋出異常)。我嘗試將引擎移植到Android,併發送和接收數據,但由於某些原因,服務器無法檢測到套接字何時關閉(readLine()仍然被阻塞並且不會引發任何異常)。我甚至試圖從互聯網上斷開Android設備,但它仍然沒有檢測到關閉的套接字。我想通過實現超時來解決問題,當客戶端很長一段時間沒有發送消息時,服務器會認爲他已經斷開連接,但這可能不是一個好的永久解決方案。在Android上未檢測到套接字被關閉?

代碼是通過的try-catch異常包圍:

String userInput; 
BufferedReader stdIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

while ((userInput = stdIn.readLine()) != null) { 
    //do something 
} 
+0

套接字是否按順序關閉或由對等關閉? – alk

+0

@alk不確定你的意思,但服務器需要知道客戶端何時斷開,即使客戶端沒有強制通過socket.close()關閉套接字,例如,當應用程序被強制終止時,它可以'調用socket.close()。 – Ladas125

+4

有100多個關於stackoverflow的問題,都詢問你所要求的一樣。其中之一是[爲什麼它不可能,沒有嘗試I/O,檢測到TCP套接字已被對方優雅地關閉?](http://stackoverflow.com/questions/155243/why-is-it-im-s-impossible-without -attempting-IO到檢測 - 即-TCP-插座是-GRAC) –

回答

0

我找到了解決辦法! Android上的Socket而不是拋出異常會導致readLine()爲null,但是當readLine()爲null時while停止時,服務器代碼不會執行任何操作。所以我通過在while語句之後添加一些代碼來修復它。