2010-05-27 29 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