确定公共 WiFi 是不是具有网络连接

Posted

技术标签:

【中文标题】确定公共 WiFi 是不是具有网络连接【英文标题】: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

我错过了什么吗?

【问题讨论】:

【参考方案1】:

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

Reference:http://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。但它不会让您的流量直接使用它。

以上是关于确定公共 WiFi 是不是具有网络连接的主要内容,如果未能解决你的问题,请参考以下文章

ios 怎么判断wifi是不是接入了互联网

有没有办法在同一个wifi网络上连接的用户之间进行视频通话

可达性 - 检查公共 Wi-Fi 连接是不是有效

Ubuntu系统如何连接无线网络?

浏览器判断ios是不是连接wifi

Exp7 网络欺诈防范 20164323段钊阳