确定公共 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
被发送回服务器,并且如果您确实在响应中收到数据包,则连接成功。
但是,您可能希望等待服务器响应或设置一些connection
或read 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 是不是具有网络连接的主要内容,如果未能解决你的问题,请参考以下文章