wake-up-neo.com

So können Sie schnell überprüfen, ob ein URL-Server verfügbar ist

Ich habe eine URL im Formular

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

Und wollen prüfen, ob es verfügbar ist.

Die Links leiten mich auf eine fehlerhafte Anforderungsseite um, wenn ich versuche, diese mit einem Browser zu öffnen. Über Code kann ich jedoch die Daten erhalten, die ich benötige.

Die Verwendung eines try-catch-Blocks für ein HTTP-Anforderungsverfahren ist ziemlich langsam. Ich frage mich, wie ich eine ähnliche Adresse anpingen könnte, um zu überprüfen, ob der Server aktiv ist.


Ich habe versucht

boolean reachable = InetAddress.getByName(myLink).isReachable(6000);

Gibt aber immer false zurück.

Ich habe es auch versucht

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;
    }
}

Dies gibt den korrekten Wert am Ende des Prozesses zurück. Das Bit ist zu langsam, wenn der Server nicht verfügbar ist.

EDIT

Ich habe verstanden, was die Ursache für Langsamkeit ist

a) Wenn der Server einige Daten zurückgibt, aber die Anforderung unterbricht, bevor die Anforderung abgeschlossen ist, wird das Zeitlimit ignoriert und bleibt hängen, bis eine Exception zurückgegeben wird, die dazu führt, dass die Ausführung den catch-Block erreicht Es wurde keine gültige Lösung gefunden, um dies zu vermeiden.

b) Wenn ich das Android-Gerät starte und die App ohne Verbindung öffne, wird der falsche Wert korrekt zurückgegeben, wenn die App bei aktivierter Internetverbindung geöffnet wird und das Gerät seine Internetverbindung verloren hat, geschieht dies wie in Fall A (auch wenn ich Versuch die App zu beenden und neu zu starten ... Ich weiß nicht warum, ich nehme an, dass etwas zwischengespeichert bleibt.

All dies scheint mit der Tatsache in Zusammenhang zu stehen, dass Java URLConnection kein ausfallsicheres Timeout beim Lesen bietet. Wenn Sie sich das Beispiel unter this link ansehen, habe ich gesehen, dass ein Thread die Verbindung auf irgendeine Weise unterbricht, aber wenn ich einfach die Zeile new Thread(new InterruptThread(Thread.currentThread(), con)).start(); wie im Beispiel hinzufüge, ändert sich nichts.

19
AndreaF
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;
}

oder mit Runtime:

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;
}

Sie können isReachable() versuchen, aber es wurde ein Fehler eingereicht und dieser Kommentar besagt, dass isReachable () root-Berechtigung erfordert :

try {
    InetAddress.getByName("your server url").isReachable(2000); //Replace with your name
    return true;
} catch (Exception e)
{
    return false;
}
19
Sagar Pilkhwal
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;
        }
    }
4
BSavaliya

hast du es mit rohen steckdosen versucht?

Es sollte schneller laufen, da es sich auf einer niedrigeren Ebene befindet

static boolean exists(String serverUrl)  {

    final Socket socket;

    try {
        URL url = new URL(serverUrl);
        socket = new Socket(url.getHost(), url.getPort());
    } catch (IOException e) {
        return false;
    }

    try {
        socket.close();
    } catch (IOException e) {
        // will never happen, it's thread-safe
    }

    return true;
}
0
eridal

Ich hatte im letzten Monat ein ähnliches Problem und jemand half mir mit einem optionalen Beispiel. Ich möchte Ihnen gleich vorschlagen

public boolean isServerReachable()
    // To check if server is reachable
    {
        try {
            InetAddress.getByName("google.com").isReachable(3000); //Replace with your name
            return true;
        } catch (Exception e) {
            return false;
        }
    }

wenn return true als Ihr URL-Server verfügbar ist, ist derzeit nicht verfügbar.

0
A_rmas

Der folgende Code wartet, bis die Webseite verfügbar ist:

public void waitForWebavailability() throws Exception {
        boolean success = false;
        long waitTime = 0;
        while (!success) {
            try {
                waitTest(30000);
                waitTime += 30000;
                if (waitTime > 600000) {

                    System.out.println("Web page is not available");
                }
                webDriver.get("http://www.google.com");
                if (webDriver.getTitle().toLowerCase().contains("sometitle")) {
                    success = true;
                }
            } catch (Exception e) {
                success = false;
            }

        }

    }

// Code related to waittest

public void waitTest(long millis) throws Exception {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            throw new Exception(e);
        }
    }
0
khajappa

Wie von "eridal" erwähnt, sollte dies schneller sein, öffnen Sie die Steckdose; Es sagt Ihnen jedoch nur, dass ein Server den Host und den Port überwacht. Um jedoch sicher zu sein, dass Sie HTTP schreiben müssen, oder alternativ eine fehlerhafte Anforderung (Junk), sollten Sie HTTP/1.1 400 Bad Request erhalten. Wenn Sie die erste zurückgelesene Zeile lesen und HTTP enthalten, können Sie sicher sein, dass der Server ein HTTP-Server ist. Auf diese Weise sind Sie sicher, dass der Server sowie ein HTTP-Server verfügbar ist.

Dies ist eine Erweiterung der obigen Antwort von eridal.

0
Ironluca

hier Der Schriftsteller schlägt das vor:

public boolean isOnline() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int     exitValue = ipProcess.waitFor();
        return (exitValue == 0);
    } catch (IOException | InterruptedException e) { e.printStackTrace(); }
    return false;
}

Könnte ich nicht einfach meine eigene Seite anpingen, die ich trotzdem anfragen möchte? Sie können sogar beides überprüfen, wenn Sie zwischen "verfügbarer Internetverbindung" und eigenen Servern unterscheiden möchten, die erreichbar sind

lesen Sie den Link. es scheint sehr gut zu sein

EDIT: In meiner Erwartung ist es nicht so schnell wie diese Methode:

public boolean isOnline() {
    NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
    return netInfo != null && netInfo.isConnectedOrConnecting();
}

sie sind ein wenig anders, aber in der Funktionalität zur Überprüfung der Internetverbindung kann die erste Methode aufgrund der Verbindungsvariablen langsam werden.

0
Emad