如何快速检查URL服务器是否可用

2022-09-01 13:12:14

我在表单中有一个网址

http://www.mywebsite.com/util/conv?a=1&from=%s&to=%s

并想检查它是否可用。

如果我尝试用浏览器打开这些链接,这些链接会在错误的请求页面上重定向我,但是通过代码,我可以获得我需要的数据。

在HTTP请求过程中使用尝试捕获块非常慢,所以我想知道如何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

b)如果我启动Android设备并在没有连接的情况下打开应用程序,则正确返回false值,如果应用程序在互联网连接处于活动状态的情况下打开并且设备失去其互联网连接,则会发生与情况A相同的情况(也如果我尝试终止并重新启动应用程序...我不知道为什么,我想有些东西仍然缓存)

所有这些似乎都与以下事实有关:在读取时不提供无故障安全超时。查看此链接中的示例,我看到它使用线程以某种方式中断连接,但是如果我像示例中那样简单地添加行,则不会有任何变化。Java URLConnectionnew Thread(new InterruptThread(Thread.currentThread(), con)).start();


答案 1
static public boolean isServerReachable(Context context) {
    ConnectivityManager connMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = connMan.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        try {
            URL urlServer = new URL("your server url");
            HttpURLConnection urlConn = (HttpURLConnection) urlServer.openConnection();
            urlConn.setConnectTimeout(3000); //<- 3Seconds Timeout 
            urlConn.connect();
            if (urlConn.getResponseCode() == 200) {
                return true;
            } else {
                return false;
            }
        } catch (MalformedURLException e1) {
            return false;
        } catch (IOException e) {
            return false;
        }
    }
    return false;
}

或使用运行时:

Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("ping www.serverURL.com"); //<- Try ping -c 1 www.serverURL.com
int mPingResult = proc .waitFor();
if(mPingResult == 0){
    return true;
}else{
    return false;
}

你可以尝试,但有一个错误为它提交了一个错误这个评论说isReachable()需要root权限isReachable()

try {
    InetAddress.getByName("your server url").isReachable(2000); //Replace with your name
    return true;
} catch (Exception e)
{
    return false;
}

答案 2
public static boolean exists(String URLName) {

        try {
            HttpURLConnection.setFollowRedirects(false);
            // note : you may also need
            // HttpURLConnection.setInstanceFollowRedirects(false)
            HttpURLConnection con = (HttpURLConnection) new URL(URLName)
            .openConnection();
            con.setRequestMethod("HEAD");
            return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

推荐