2011-12-02 125 views
2

當我突然改變WiFi網絡時,我的應用中的serversocket會發生什麼?我猜它會關閉,因爲我的設備會得到一個新的IP,至少在TCP中,UDP MulticastSocket是否也容易出現這種情況?以及如何在網絡更改時結束以前的服務器套接字線程並啓動一個新線程?一種解決方案是使用超時,另一種方法是使用一個標誌來指示無限循環是否應該結束,但由於監聽套接字是一種阻塞功能,因此無論如何它都會產生異常/錯誤。當我切換wifi網絡時,TCP/UDP serversocket會發生什麼?

任何想法可以理解的! :)

編輯:我的服務器線程的示例。

ServerSocket ss = new ServerSocket(4445); 
while(true){ 
    Socket socket = ss.accept(); 
    ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); 
    Object obj = in.readObject(); 
    Log.i("TAG", "Received: " + obj.toString()); 
    in.close(); 
    socket.close(); 
} 

回答

3

TCPIP連接將斷開。所以客戶端將不得不再次連接。

UDP將確定提供您的IP重新連接之後不會改變。當然,如果你傳輸UDP,它不會對那臺機器產生影響。

您應該在可以處理的TCPIP情況下發生異常。

+1

它是一個whiel,因爲我研究過這一點:不UDP首先建立某種聯繫?隨機爆炸沒有連接的UDP數據包只是看起來不會工作 – TheLQ

+1

@TheLQ:據我所知,它只是傳輸一個包含目標ip和端口的數據包。它不保證交付。它直到網絡基礎設施來傳遞數據包。因爲它是無連接的,所以它不會受到網絡故障的影響。 –

+1

@TheLQ UDP是無連接協議,因此不建立連接。 (也可以調用connect()在UDP套接字但這一切確實設置爲發送一個默認的IP地址/端口()發送到,它實際上並沒有改變任何事物的邏輯) –

1

未綁定到地址UDP套接字將保持打開狀態,因爲它們是無狀態的。未綁定到該地址的TCP偵聽套接字也將保持打開狀態。

連接的TCP套接字可能會被切斷(RST)或者直到超時。

這是一個鮮爲人知的事實,即IP規定,默認情況下,設備將接受指向它在任何接口上配置的任何地址的數據包,而不管數據包到達哪個接口。如果不是這樣,路由將被打破。可以使用數據包過濾器根據接口過濾掉具有不匹配地址的數據包。

+0

請檢查編輯。 所以,當我改變網絡我的ServerSocket不會關閉,但會發生什麼'socket = ss.start()'?這將使我的服務器綁定?我的應用程序會拋出錯誤並強制關閉?如何克服這個問題,我應該注意哪些例外? – Miky

+0

是否公平總結這個答案,「聽是指定INADDR_ANY(0)的綁定通話不會被打破了處於連接狀態將突破插座,但活躍的TCP套接字。」不熟悉Android,我假設上面的「新ServerSocket(4445)」綁定到IP = 0上的端口4445。 – selbie

+0

@selbie:他們不會中斷:例如,我已經將我自己的機器之間的SSH超時設置爲幾個小時。如果我用我的筆記本電腦離開房子,SSH仍然打開,請連接到外部網絡,然後在回家後仍然處於超時狀態,SSH連接仍然繼續。重點是:IP地址不是綁定到接口,而是綁定到主機。爲接口設置IP地址實際上與路由有關,即在哪個設備上發送特定子網的數據包(第一個)。 – datenwolf

相關問題