【问题标题】:Check for an actual internet connection检查实际的互联网连接
【发布时间】:2014-01-13 23:10:41
【问题描述】:

我在一个应用程序中有以下代码,它将检查互联网连接。它确实有效,即如果没有互联网,就会说没有互联网(与使用 ConnectivityManager 不同,它只会告诉您是否连接到路由器/3g,但实际上并不检查互联网连接),但只有直到有人连接到将用户重定向到登录页面的 wifi 点。然后应用程序将返回 200 代码并尝试继续,但最终会崩溃(并且崩溃有点安静)。我的应用程序主要用于有这样一个 wifi 热点的位置。如何检查请求是否被重定向?

class online extends AsyncTask<String, String, String> 
{
    boolean responded = false;
    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();
        pDialog2 = new ProgressDialog(Main.this);
        pDialog2.setMessage("Checking internet, please wait...");
        pDialog2.setIndeterminate(false);
        pDialog2.setCancelable(false);
        pDialog2.show();
    }

    protected String doInBackground(String... args) 
    {
        try
        {

            URL url = new URL("http://mydomain.com/connectionTest.html");

            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setConnectTimeout(6000); // Timeout is in seconds
            urlc.setReadTimeout(6000);
            urlc.connect();
            if (urlc.getResponseCode() == 200) 
            {
                responded = true;
            } else 
            {

            }

        } catch (IOException e)
        {
        }

        try
        {
            int waited = 0;
            while (!responded && (waited < 5000))
            {
                mHandler.postDelayed(new Runnable() 
                {
                    public void run() 
                    {
                    }
                }, 100);
                waited += 100;
            }
        }
        finally
        {
            if (!responded)
            {
                h.sendEmptyMessage(0);
            }
            else
            {
                h.sendEmptyMessage(1);
            }
        }
        return null;
    }

    protected void onPostExecute(String file_url) 
    {
        pDialog2.dismiss();
    }
}

【问题讨论】:

    标签: android


    【解决方案1】:

    如果您可以控制要连接的网络服务,则可以使用类似于 Google 检查 Wi-Fi 重定向门户的技巧。

    您偶尔会看到发送至http://google.com/generate_204 的请求。如果您在公共接入点密码页面后面,那么您通常会从拦截 Web 请求的服务器收到200 Ok,以便为登录页面提供服务。如果用户已经登录,那么您将收到来自服务的 HTTP 204 No Content 状态。

    要检查您是否可以访问公共网络,您可以运行以下命令;

    URL url = new URL("http://google.com/generate_204");
    HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection();
    httpUrlConnection.setConnectTimeout(6000); // Timeout is in seconds
    httpUrlConnection.setReadTimeout(6000);
    httpUrlConnection.connect();
    if (httpUrlConnection.getResponseCode() == HttpURLConnection.HTTP_NO_CONTENT) {
        // Great you have free access to the web
    } else {
        // Either your server is mis-configured or you are behind a hotspot login screen
    }
    

    理想情况下,您应该在自己的网络服务器上托管自己的/generate_204,这样您就不会被 Google 的无证更改所吸引。此外,它还可以用作检查从设备到服务器的可访问性的一种方式。

    将它与ConnectivityManager 结合使用应该可以让您清楚地了解网络状态和服务器的可访问性。

    【讨论】:

    • 我确实有自己的网站(我的应用程序正在连接到它)。所以你是说我应该在上面放一个 generate_204 页面并尝试达到它?
    • 是的,那将是最好的选择。如果您使用的是 Apache,那么您可以在您的配置中使用 RedirectMatch 204 generate_204$ 创建一个 204 生成器。不幸的是,除了 Apache,我无能为力,您需要查看服务器的文档,看看是否可行。否则,您将需要回退到可用的服务器端语言来为您生成 204。
    • 酷。让我自己 100% 清楚。我得到 204 响应(使用 Apache/php/whatever)。让应用程序(尝试)连接到该页面,如果没有热点登录页面,那么我会得到 204,一切都很好,如果没有,那么我会打印一条消息,说没有互联网访问等。
    • 是的,就是这样。等待一个不返回 200 的热点。但我认为这太不合理了 :)
    • 抱歉打字速度比我想象的要快,我已经更正了答案。
    猜你喜欢
    • 2022-12-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2011-04-15
    • 2017-03-16
    • 2014-02-08
    • 2012-06-12
    相关资源
    最近更新 更多