【问题标题】:Determine if public WiFi has network connectivity确定公共 WiFi 是否具有网络连接
【发布时间】:2015-06-17 18:18:46
【问题描述】:

是否可以确定用户已连接的公共WiFi 网络是否具有活动连接?

例如:您走进一家星巴克,在那里您可以连接到他们的免费WiFi。需要注意的是,您需要接受他们的条款和条件才能使用它。

换句话说,有没有办法确定即使设备连接到星巴克WiFi,他/她是否真的可以使用internet?我查了一堆不同的 SO 帖子:

How to check internet is available in wifi(Though Wifi is connected )

how to check that internet on local wifi is available or not?

它们都不起作用。显然,尽管连接到上述WiFi 网络,但响应中收到的http status code 对我来说仍然是200

我错过了什么吗?

【问题讨论】:

    标签: android networking wifimanager


    【解决方案1】:

    我知道您尝试 ping 服务器并得到 200 的响应代码,这是正常的情况,但是当您得到 200 的响应时,这可能取决于各种因素。

    Referencehttp://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

    现在,我相信如果data packets 被发送回服务器,并且如果您确实在响应中收到数据包,则连接成功。

    但是,您可能希望等待服务器响应或设置一些connectionread timeout 以确保没有错误响应。

    这是我过去用来确定互联网连接的示例代码。我正在使用Process 来确定检查并尝试将返回值设为0

    public Boolean isConnectionAvailable() {
            try {
                Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
                int returnVal = process.waitFor();
                boolean reachable = (returnVal == 0);
                if (reachable) {
    
                    Log.i(TAG, "Connection Successful");
                    return reachable;
                } else {
    
                    Log.e(TAG, "No Internet access");
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
            } finally {
                process.destroy();
            }
            return false;
        }
    

    在上面的代码中,我有谷歌服务器作为检查的媒介。但是,您也可以像这样使用 8.8.8.8:

    Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 8.8.8.8");
    

    进程执行时,会给出一个返回值,这将决定连接的失败和成功。

    关键元素是使用来自causes the calling thread to wait for the native process associated with this object to finish executing. 的java 类Process.class 中的waitFor() 方法。

    参考:http://developer.android.com/reference/java/lang/Process.html#waitFor%28%29

    试一试,如果有帮助,我会很高兴。如果有更好的答案,我很高兴接受它.. 谢谢.. :)

    【讨论】:

    • 对 OP 的良好尝试。但并不总是有效。在某些情况下表现得非常不稳定。根据我的阅读,获取运行时环境并生成新进程也是一种相当冒险的方法。
    【解决方案2】:

    如果有条款和条件......那么在它们被接受之前你将无法判断。如果没有先决条件……那么自动连接和 ping 已知的外部服务器将很好地表明这种情况。

    【讨论】:

      【解决方案3】:

      网络可能是使用透明代理连接的。如果是这种情况,则与 Internet 没有直接联系,即没有数据包简单地来回传递。

      TP 拦截 HTTP 请求,并代表您在真实网络上发出请求。这就是为什么他们可以插入一个请求用户登录或类似操作的屏幕,用户可以通过他/她的网络导航器获得该屏幕。

      TP 可能会配置为响应使用 HTTP 和 HTTPs 协议的连接请求。

      【讨论】:

      • 您是否建议使用透明代理,用户已经在线,只是需要登录才能真正让 TP 代表您拨打电话?
      • @user2511882 "没有直接连接" 用户只连接到代理。登录机制可能需要也可能不需要,或者它可能只是为了让用户知道条款和条件的存在。但是,如果您确实看到它,它确实会告诉您设备和网络服务器之间的连接出现问题。
      • 即使连接到代理,用户也不需要在线,因为代理本身托管在某个 IP 地址上?
      • 不,代理在本地网络上,通常是出站路由器。代理有两个接口,一个到 Internet。但它不会让您的流量直接使用它。
      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      相关资源
      最近更新 更多