当我从url.openStream()中捕获异常时,我不想告诉互联网不可用的困难方式。
是否有一种简单的方法可以判断计算机是否通过Java连接到Internet? 在这种情况下,“连接到互联网”意味着能够从特定网址下载数据。
如果我尝试从它下载并且它不可用,那么该程序会挂起一点。我不想那么挂。因此,我需要一种快速的方式来查询网站是否可用。
答案 0 :(得分:10)
您要避免的问题是等待您的http连接确定您尝试访问的URL确实不可用。为了实现这一点,你需要停止使用url.openStream()这是openConnection()。getInputStream()的快捷方式,并对你的连接有一个更好的控制。
URLConnection conn = url.openConnection();
conn.setConnectTimeout(timeoutMs);
conn.setReadTimeout(timeoutMs);
in = conn.getInputStream();
如果连接或读取超过了您在timeoutMs参数中提供的时间,此代码将允许您超时连接尝试。
答案 1 :(得分:5)
使用
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
答案 2 :(得分:4)
没有“互联网可用性”这样的东西。 想象一下,您的HTTP请求通过透明的HTTP代理,您正在尝试访问列入黑名单的站点,并从代理服务器获得HTTP响应,告知您访问被拒绝。在这种情况下是否可以使用Internet?
我认为你应该更加具体地解决你的问题。
答案 3 :(得分:2)
您可能能够判断一个计算机是否已连接到网络,但即使它不能保证网络正常工作或者它已连接到互联网。
这是其中一个“吮吸并看到”问题。
尝试连接有什么问题?你为什么担心他们是否连接到互联网?
答案 4 :(得分:2)
如果标准是您是否可以访问给定的Web服务器,唯一的方法就是访问该Web服务器。
但是,您可以在启动时在后台线程中执行此操作,以便应用程序不会因此而延迟。然后,当需要实际下载时,可以使用“是/否”答案。在状态行中放置一条消息,以便用户知道发生了什么,并且如果在程序启动时未连接s / he,则不会对未启动的“连接到网络”感到惊讶。
答案 5 :(得分:1)
我对Java中可用的低级HTTP管道知之甚少,但您可以提前为该URL发出http HEAD请求。这会导致服务器仅发回标头而不是数据。如果超时1-3秒,您应该可以避免任何长时间的延迟。
答案 6 :(得分:1)
如果程序在等待下载时挂起,那么您可能正在使用GUI线程进行下载。如果您使用后台线程,即使超时/下载需要很长时间,您的程序也不会挂起。
答案 7 :(得分:0)
您可以向知名主持人发送ICMP消息......
答案 8 :(得分:0)
如果您的防火墙不禁止,您可以检查NTP server。
我认为最好的选择是尝试在尝试避免时打开URL,因为最常打开的服务是这样。
您可以检查一个或两个不断变化的动态网址。对于instace,一些显示时间的网络。例如this one我找到了googleing。不止一个,因为网站可能会关闭; - )