我在表单中有一个 URL
http://www.mywebsite.com/util/conv?a=1&from=%s&to=%s
并想检查它是否可用。
如果我尝试使用浏览器打开这些链接,这些链接会将我重定向到错误的请求页面,但是通过代码我可以获得所需的数据。
在 HTTP 请求过程中使用 try-catch 块非常慢,所以我想知道如何 ping 一个类似的地址以检查其服务器是否处于活动状态。
我努力了
boolean reachable = InetAddress.getByName(myLink).isReachable(6000);
但总是返回false
。
我也试过
public static boolean exists(String URLName) {
try {
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(URLName).openConnection();
con.setConnectTimeout(1000);
con.setReadTimeout(1000);
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
在进程结束时返回正确的值,如果服务器不可用,位太慢。
编辑
我已经了解缓慢的原因是什么
a)如果服务器返回一些数据但在完成请求之前中断了请求,超时将被忽略并卡住,直到返回Exception
导致执行到达 catch 块,这是此方法缓慢的原因,但我仍然没有t 找到了避免这种情况的有效解决方案。
b)如果我启动 android 设备并在没有连接的情况下打开应用程序,则正确返回 false 值,如果应用程序在 Internet 连接处于活动状态的情况下打开并且设备失去其 Internet 连接,则与案例 A 发生相同的事情(如果我尝试终止并重新启动应用程序...我不知道为什么,我想有些东西仍然被缓存)
所有这些似乎都与Java URLConnection
在读取时没有提供故障安全超时的事实有关。查看此链接上的示例,我看到它使用线程以某种方式中断连接,但是如果我new Thread(new InterruptThread(Thread.currentThread(), con)).start();
像示例中那样简单地添加行,则没有任何变化。