【问题标题】:Wifi connection works inspite of access point尽管有接入点,Wifi 连接仍然有效
【发布时间】:2017-10-20 08:21:30
【问题描述】:

我有一个测试 wifi 连接是否可用的代码。

public boolean checkInternetConnection() {

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
    try {
        URL url = new URL("http://www.google.com");
        HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
        urlc.setRequestProperty("User-Agent", "Test");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(3000);
        urlc.setReadTimeout(4000);
        urlc.connect();
        if (urlc.getResponseCode() == HttpURLConnection.HTTP_OK) {
            Log.i(TAG,"Internet connection is OK");
            return true;
            }
        } catch (MalformedURLException mue) {
              mue.printStackTrace();
        } catch (IOException ie) {
              ie.printStackTrace();
        }
    }
    Log.i(TAG, "No internet connection.");
    return false;
}

要访问互联网,我必须通过一个访问点,这就是我特别 ping google 的原因,因为如果我们也登录了我需要。我注意到在很多情况下,即使我没有登录强制门户,代码 sill 到达 google 并返回 true。我也可以上网服务器,例如 ftp。 有谁知道这种行为的原因是什么?有其他人注意到这种行为吗?

谢谢,

【问题讨论】:

  • 我没有看到你在 ping 谷歌。也没有登录。也不是强制门户。不管那是什么。

标签: android wifi captivenetwork


【解决方案1】:

一些强制门户允许在不登录有限服务集的情况下进行访问(例如 WiFi 服务所有者的公司公司网站)。我已经看到在我多年来使用的一些 WiFi AP 中允许使用 Google 头版。这可能是你注意到的。

也许更好的方法(或额外方法)是检查网络详细状态NetworkInfo.html#getDetailedState(),它还为您提供有关强制门户检测的信息。

此外,在您自己的服务器中检查特定页面可能会有所帮助(在不登录的情况下不太可能被允许),另外通过 HTTPS 而不是普通 HTTP 可能会为您提供更多信息(获得证书而不是匹配错误,因为强制门户就像中间人一样)。

【讨论】:

  • 我在上面的代码中添加了 NetworkInfo.html#getDetailedState()。我尝试不登录门户,我得到状态 CONNECTED 并且 chechInternet 函数返回 true。虽然这一次,我无法访问外国服务器,尽管它有时可以工作(这不是我的服务器,我没有任何服务器)。我在登录门户后尝试过,我得到了相同的答案 CONNECTED。
  • 在对您的代码进行第二次审查时,您并没有真正检查您是否访问了 google.com。您只是在检查是否获得了 200 Ok 的页面,但您不知道该页面是否真的是 google.com 或强制门户。如果您将 URL 更改为 google.com(正如我在回答中已经说过的),您可能会收到证书错误,这将使您能够更准确地检查连接。
  • 再次感谢您的帮助。我尝试将 URL url = new URL("google.com"); 切换到 URL url = new URL("google.com"); 我得到 java.net.MalformedURLException: Protocol not found: google.com 但我想我误解了你问了什么。
  • 抱歉,没有意识到 URL 已更改为链接。我的意思是https://www.google.com(例如,将 URL 从 HTTP 更改为 HTTPS)。
  • 通常没有重定向,您会获得任何 URL 的强制门户,就像这是该 URL 的内容(因此会以某种方式暂时劫持所有连接)。这就是您获得SSLPeerUnverifiedException 的原因,因为如果您使用 SSL,则证书不匹配(您通常会获得通用或自签名证书)。因此,当您在强制门户中时,预计会出现异常(这就是我建议使用 HTTPS 的原因)。您在登录后也得到的原因也可能是因为缓存(尝试登录,然后在强制停止后启动应用程序,这将证明这一点)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多