2010-05-27 61 views
3

我對Android中的網絡連接過程有一個疑問。Android中通過Wi-Fi和3G進行持續連接

我的場景就像是, 我使用3G通過TCP連接到遠程服務器。連接後,我啓用了Wi-Fi。 Android已切換到WiFi。而且,服務器仍然保持連接,意味着沒有連接丟失。

在這裏,我想知道一件事。 當N/W從3G切換到Wi-Fi時,Android(或任何其他)設備是否也會更改其IP地址? 如果它改變了它的IP,這個舊連接是否有效? (意味着,在新的IP上,應該有新的連接。)

在此先感謝。

+0

你如何知道連接沒有像你說的那樣「放下」? HTTP例如是無狀態的,每個連接都可以獨立於前一個。 – 2010-05-27 01:54:52

+0

對不起,延遲迴復。我在循環中有一個「read()」,每3秒會解鎖一次。如果連接斷開,「read()」將返回'-1'。但是我的代碼沒有返回'-1',並且仍然能夠每隔3秒阻止和解除「read()」。 – Andhravaala 2010-05-27 02:14:35

回答

2

我明白的是IP地址會改變。當手機切換到WiFi時,您的路由器會爲設備分配IP地址。我懷疑Android可能正在重新啓動IP堆棧(只是一個猜想),我不記得任何一種「切換」機制讓設備擁有相同的IP地址。雖然這可能在理論上是可能的,但我不確定它可以使事情變得複雜:)另外,Android只有一個網絡接口卡,所以它不可能同時保留這兩個IP地址。如果它切換到WiFi,它只保留Wifi IP地址。

我也從我的經驗觀察,這樣的場景將失敗:

  • Android是通過3G連接最初
  • 的Android應用程序發送一個HTTP GET到Web服務器
  • 的Android感應更好WiFi連接和來自3G的交換機

在這種情況下,GET請求失敗。

可能的解決方案:

  • 嘗試多次:3倍(或不同的幻數,但3在大多數情況下工作對我來說)使用try-catch-repeat應該解決大部分問題。
  • 這樣使用代碼來檢查網絡連接,並從那裏繼續:

    if(!isOnline()) { 
        Log.e("OFFLINEERROR", "No Network Connectivity"); 
    } 
    
    public boolean isOnline() { 
        try { 
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
        return cm.getActiveNetworkInfo().isConnectedOrConnecting();   
        } catch(Exception e) { 
        //Returned a null so no Internet connection! 
        return false; 
        } 
    } 
    
  • 組塊的轉移(即使你失去了你的連接這種方式,你仍然可以完成傳輸)。

希望這會有所幫助。

+0

嗨傳奇,謝謝你的回答。你說得對,IP地址會改變。所以,Client正在開始新的會話。 我的問題是2個會話,遠程服務器無法關閉舊會話,因爲它沒有得到PIN Act。無論如何,這是不同的問題。 非常感謝您的好解釋。 – Andhravaala 2010-06-09 04:40:10