如何在Java中测试互联网的可用性?

当我从url.openStream()中捕获exception时,我不想告诉互联网不可用的困难方式。

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

如果我尝试从它下载​​并且它不可用,那么该程序会挂起一点。 我不希望那个悬挂。 因此,我需要一种快速的方式来查询网站是否可用。

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

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

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

使用

 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 

没有“互联网可用性”这样的东西。 想象一下,您的HTTP请求通过透明的HTTP代理,您正在尝试访问列入黑名单的站点,并从代理服务器获得HTTP响应,告知您访问被拒绝。 在这种情况下是否可以使用Internet?

我想你会更具体地解决你的问题。

您可能能够判断计算机是否连接到网络,但即使它不能保证网络正常工作或者它已连接到互联网。

这是“吮吸和看到”问题之一。

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

如果标准是您是否可以访问给定的Web服务器,唯一的方法是访问该Web服务器。

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

我不太了解Java中可用的低级HTTP管道,但您总是可以提前为URL发出http HEAD请求。 这会导致服务器仅发回标头而不是数据。 在1-3秒的超时时间内,您应该可以避免任何长时间的延迟。

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

您可以向知名主机发送ICMP消息…

如果您的防火墙不禁止,您可以检查NTP服务器 。

我认为最好的选择是尝试在您尝试避免时打开URL,因为这是最常打开的服务。

您可以检查一个或两个不断变化的动态URL。 对于instace,一些显示时间的网络。 例如,我找到了googleing。 不止一个,因为网站可以关闭;-)