android - 通过 Android 中的 Wi-Fi 和 3G 持续连接

标签 android networking

我对 Android 中的网络连接过程有一点疑问。

我的场景是这样的, 我正在使用 3G 通过 TCP 连接到远程服务器。连接后,我启用了 Wi-Fi。 Android 已切换到 WiFi。而且,与服务器的连接仍然有效,这意味着没有连接断开。

在这里,我想知道一件事。 当 N/W 从 3G 切换到 Wi-Fi 时,Android(或任何其他)设备是否也会更改其 IP 地址? 如果它更改了 IP,旧连接是否有效? (意味着,在新的 IP 上,应该再次有新的连接。)

提前致谢。

最佳答案

我的理解是IP地址会变。当手机打开 WiFi 时,您的路由器会为设备分配 IP 地址。我怀疑 Android 可能会重新启动 IP 堆栈(虽然只是一个猜想),我不记得看到过任何一种“切换”机制来让设备拥有相同的 IP 地址。虽然这在理论上可能是可行的,但我不确定它会使事情变得多复杂:) 此外,Android 只有一个网络接口(interface)卡,因此它不可能同时保留两个 IP 地址。如果它切换到 WiFi,它只保留 Wifi IP 地址。

我确实从我的经验中观察到,像这样的场景会失败:

  • Android 最初通过 3G 连接
  • Android 应用程序向 Web 服务器发送 HTTP GET
  • Android 感知到更好的 WiFi 连接并从 3G 切换

在这种情况下,GET 请求失败。

可能的解决方案:

  • 尝试多次:使用 try-catch-repeat 3 次(或不同的魔数(Magic Number),但在大多数情况下 3 次对我有用)应该可以解决大部分问题。
  • 使用这样的代码检查网络连接并从那里继续:

    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;
      }
    }
    
  • 分块传输(这样即使您失去连接,您仍然可以完成传输)。

希望这对您有所帮助。

关于android - 通过 Android 中的 Wi-Fi 和 3G 持续连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2917943/

相关文章:

java - 我如何在 ListView 中打开 Activity 数组类名

ios - 将 NSDictionary 映射到 NSObject 子类

python 在本地网络(linux -> linux)中复制文件并输出

c# - 无法在我的 C# 应用程序中添加静态端口映射

java - 我应该导入哪个 .jar 以便 "import com.android.widget"解析为类型?

android - OnTouchListener - ActionMove (android) 在一个触摸点给出不同的位置

Python 套接字错误弹性/解决方法

用于同步用户事件的 iOS 网络技术

java - 安卓工作室 : Warning while I try to move Class to another package

android - 图像数据使用