【发布时间】:2009-03-13 22:35:35
【问题描述】:
当我从 url.openStream() 捕获异常时,我不想说互联网不可用。
有没有一种简单的方法可以用 Java 判断计算机是否连接到互联网? 在这种情况下,“连接到互联网”意味着能够从特定 url 下载数据。
如果我尝试从它下载但它不可用,那么程序会挂起一段时间。我不想这样挂。因此,我需要一种快速查询网站是否可用的方法。
【问题讨论】:
标签: java
当我从 url.openStream() 捕获异常时,我不想说互联网不可用。
有没有一种简单的方法可以用 Java 判断计算机是否连接到互联网? 在这种情况下,“连接到互联网”意味着能够从特定 url 下载数据。
如果我尝试从它下载但它不可用,那么程序会挂起一段时间。我不想这样挂。因此,我需要一种快速查询网站是否可用的方法。
【问题讨论】:
标签: java
您要避免的问题是等待您的 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 服务器。
但是,您可以在启动时在后台线程中执行此操作,这样应用程序就不会被它延迟。然后,当需要实际下载时,可以使用“是/否”的答案。在状态行中添加一条消息,以便用户知道发生了什么,并且如果在您的程序启动时她/他没有连接,则不会对未启动的“连接到网络”感到惊讶。
【讨论】:
我对 Java 中可用的低级 HTTP 管道了解不多,但您总是可以提前发出对 url 的 http HEAD 请求。这会导致服务器只发回标头而不发回数据。通过 1-3 秒的超时,您应该能够避免任何长时间的延迟。
【讨论】:
如果您的程序在等待下载时挂起,那么您可能正在使用 GUI 线程进行下载。如果您使用后台线程,即使超时/下载需要很长时间,您的程序也不会挂起。
【讨论】:
您可以向一个非常知名的主机发送 ICMP 消息...
【讨论】:
如果您的防火墙不禁止,您可以检查NTP server。
我认为最好的方法是尽量避免打开 URL,因为这是最常打开的服务。
您可以检查一个或两个不断变化的动态 URL。例如,一些显示时间的网络。例如this one 我发现谷歌搜索。不止一个,因为网站可能会关闭;-)
【讨论】: