如何用Java测试internet的可用性?

如何用Java测试internet的可用性?,java,Java,当我从url.openStream()捕捉到异常时,我不想告诉大家互联网不可用 有没有一种简单的方法来判断计算机是否用Java连接到internet? 在这种情况下,“连接到互联网”意味着能够从特定的url下载数据 如果我尝试从它下载,但它不可用,那么程序会挂起一点。我不想被绞死。因此,我需要一种快速查询网站是否可用的方法 您可能能够判断一个computer是否连接到网络,但即使连接到网络,也不能保证网络正常工作或连接到internet 这是一个“吸了就看”的问题 尝试连接有什么问题?你为什么要

当我从url.openStream()捕捉到异常时,我不想告诉大家互联网不可用

有没有一种简单的方法来判断计算机是否用Java连接到internet? 在这种情况下,“连接到互联网”意味着能够从特定的url下载数据


如果我尝试从它下载,但它不可用,那么程序会挂起一点。我不想被绞死。因此,我需要一种快速查询网站是否可用的方法

您可能能够判断一个computer是否连接到网络,但即使连接到网络,也不能保证网络正常工作或连接到internet

这是一个“吸了就看”的问题

尝试连接有什么问题?你为什么要担心他们是否连接到互联网?

没有“互联网可用性”这样的东西。 假设您的HTTP请求通过一个透明的HTTP代理,您试图访问一个被列入黑名单的站点,并且您从代理服务器得到一个HTTP响应,告诉您访问被拒绝。在这种情况下互联网是否可用


我认为您应该更具体地说明您的问题。

您可以向非常知名的主机发送ICMP消息

如果您的防火墙不禁止,您可以检查是否存在漏洞

不管怎样,我认为最好的选择是尽量避免打开URL,因为URL是最常被打开的服务


您可以检查一个或两个不断变化的动态URL。对于Instance,一些显示时间的web。例如,我发现谷歌搜索。不止一个,因为站点可能已关闭;-)

我不太了解Java中可用的低级HTTP管道,但是您可以提前发出HTTP HEAD请求以获取url。这会导致服务器只发回头,而不发回数据。使用1-3秒的超时时间,您应该能够避免任何长时间的延迟。

如果标准是您是否可以访问给定的web服务器,那么唯一的方法就是访问该web服务器


但是,您可以在启动时在后台线程中执行此操作,这样应用程序就不会因此而延迟。当需要实际下载时,“是/否”回答可用。在状态行中放置一条消息,以便用户知道发生了什么,并且在程序启动时,如果用户未连接,则不会对未初始化的“连接到网络”感到惊讶。

您试图避免的问题是等待http连接确定您尝试访问的URL确实不可用。为了实现这一点,您需要停止使用url.openStream(),这是openConnection().getInputStream()的快捷方式,并对您的连接进行更好的控制

URLConnection conn = url.openConnection();  
conn.setConnectTimeout(timeoutMs);  
conn.setReadTimeout(timeoutMs);  
in = conn.getInputStream();  

如果连接或读取超过timeoutMs参数中提供的时间,此代码将允许您超时连接尝试。

如果您的程序在等待下载时挂起,则您可能正在使用GUI线程进行下载。如果使用后台线程,即使超时/下载需要很长时间,程序也不会挂起。

使用

Process p1 = java.lang.Runtime.getRuntime().exec("ping www.google.com");
System.out.println(p1.waitFor());
// return code for p1 will be 0 if internet is connected, else it will be 1

很多网络,特别是公司网络,都会阻塞ICMP通信。@cletus他说一个非常“有名”的。。。因此,它应该是一个允许ICMP流量的主机:)这只是一个普通的解决方案,因为除非您在单独的线程中执行此操作,否则您仍然会遇到“挂起”问题。您能推荐一个更好的解决方案吗?我已经在使用一个单独的线程来下载数据了。非常感谢。回答得好。