Website-Zugriff beenden

Johzi

Mitglied
Ich hab ein Problem bei dem ich nicht weiter komme und es ach nicht so formulieren kann, dass ich etwas über google gefunden habe. Nämlich ich rufe über Java eine Website auf und caste sie zu Strings. Mein Problem ist jetzt aber, dass die Website einfach nicht antwortet und auch keinen Errorcode liefert oder ähnliches, dass heißt dass mein Programm an der stelle hägt, weil keine Antwort kommt. Deshalb will ich dem Aufruf einfach eine bestimmte Zeit geben, z.B. 5 Sekunden und wenn keine Antwort kommt einfach weiter machen.
 
Zuletzt bearbeitet von einem Moderator:
warum so allgmein, nenne doch Details von deinem Programm, mit welchem Code greifst du auf die Seite zu?
Socket kennen das Prinzip Timeout, ein allgemeiner Fachbegriff suche danach (zusammen mit Socket oder was auch immer),
alle höheren oder anderen APIs müssen sich daran messen, vergleichbares anbieten oder sind weniger geeignet

ich werde noch das Thema umbenennen und verschieben, ist kein Java-Basic,
allgemein kann man übrigens schlecht Java-Code anhalten, wenn auch möglich,
sofern aber Netzwerkressourcen beteiligt sind ist es zudem noch wichtig genau auf diese zu achten, statt nur den Java-Code abzubrechen und die Verbindung vielleicht in unkontrollieren nicht beendeten Zustand zurückzulassen
 
also timer nnutzen und die fkt am besten in nem thread starten.
dann reagiert dein prog noch da es nebenläufig bearbeitet wird und dein mainthread unbelastet bleibt

und dazu kannst nen timer stellen und nach ka 10 sec einfahc den thread abrechen
darüber hinaus kannst noch ne schicke lade animation in der gui starten um zu sehen aahh da läuft was

wenn ihc mich nicht irre kannst sogar in dem timer die funktion starten und dann dem timer sagen wie lang es höchsten dauern darf aber da musst mal selbst schauen

thread: Thread (Java Platform SE 7 )
timer: Timer (Java Platform SE 7 )

true dat slaterB ^^
man sollte hier immer noch versuchen eventuell exceptions zu werfen/fangen und dementsprechend connections wieder zu schließen und alles aufzuräumen
 
Zuletzt bearbeitet:
Ich benutze eine Klasse die ich hier: Content einer Webseite parsen @ Java - tutorials.de: Tutorial, Forum, Anleitung & Hilfe
gefunden habe nur leicht modifiziert.

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
 
/*
 * Created on 21.11.2003
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
 
/**
 * @author Administrator
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class WebsiteReader {
    final String[] KEYWORDS = { "tutorials", "http" };
    public static void main(String[] args) {
        new WebsiteReader().doIt("http://www.tutorials.de");
    }
 
    /**
     * 
     */
    private void doIt(String s) {
        // TODO Auto-generated method stub
 
        BufferedReader br = null;
        InputStreamReader isr = null;
        URL url = null;
        try {
            url = new URL(s);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
        if (url != null) {
            try {
                isr = new InputStreamReader(url.openStream());
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            br = new BufferedReader(isr);
 
            String line = null;
 
            try {
                while ((line = br.readLine()) != null) {
                    if (checkKeyWords(line)) {
 
                        System.out.println(line);
                    }
                }
 
            } catch (IOException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }
 
        }
 
    }
 
    /**
     * @param line
     * @return
     */
    private boolean checkKeyWords(String line) {
        // TODO Auto-generated method stub
 
        for (int i = 0; i < KEYWORDS.length; i++) {
            if (line.indexOf(KEYWORDS[i]) >= 0)
                return true;
        }
 
        return false;
    }
}
 
Da kann man was machen. An dieser Stelle:
[JAVA=44]
isr = new InputStreamReader(url.openStream());
[/code]
Machst Du im Hintergrund implizit eine URLConnection auf. Diese bietet die Möglichkeit über URLConnection#setReadTimeout(int) einen Timeout in Millisekunden zu definieren.

Du musst Deinen Code also so umschreiben, dass Du an diese URLConnection herankommst. Ungefähr so:
[JAVA=44]
/*
* Für das von Dir Nachgefragte brauchst Du eigentlich "nur" URLConnection.
* Da Du aber weißt, dass die URL eine http-URL ist, kannst du hier sicher casten.
* Damit erhälst Du Zugriff auf die erweiterte Funktionalität von HttpURLConnection
* Nähere Infos:
* docs.oracle.com/javase/7/docs/api/java/net/HttpURLConnection.htmlHttpURLConnection
*/
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
urlConn.setReadTimeout(10_000);
isr = new InputStreamReader(urlConn.getInputStream());
[/code]
 
Zuletzt bearbeitet von einem Moderator:
und ich bekomm als return Wert dann null wenn ich einen Timeout habe.
Also wenn ich es so
Java:
for(;isr!=null;){
	HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
	urlConn.setReadTimeout(30000);
	isr = new InputStreamReader(urlConn.getInputStream());}

mache versucht er so lang ne connection aufzubauen bis es klappt oder?
 
Zuletzt bearbeitet:
und ich bekomm als return Wert dann null wenn ich einen Timeout habe oder?
Nein, bei Timeout wird nicht returned, sondern eine SocketTimeoutException geworfen. Das steht auch in der Doku zu setReadTimeOut. Die habe ich in meinem letzten Post extra verlinkt (lesen!)

Die könntest Du extra behandeln, wenn du möchtest. Im Moment wird sie von dem catch-Block hier:
[JAVA=45]
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
[/code]
behandelt, weil sie eine Subklasse von IOException ist.
 
In dem Link steht nur:

Throws:
IllegalArgumentException - if the timeout parameter is negative

Und wenn mien Englisch was taugt heißt das, dass nur ein Error übergeben wird, wenn ein negativer Wert übergeben wird.
 
setReadTimeout() liefert naheliegend direkt eine Fehlermeldung wenn man Quatsch übergibt,
das hat aber mit dem Netzwerkzugriff, tatsächlich stattfindenden Timeout usw. weniger zu tun

da ist die Frage, was urlConn.getInputStream() werfen kann usw.
 
Es reicht halt nicht, nur in die Throws:-Section zu gucken. Denn, mit "Throws:" werden die Exceptions dokumentiert, die die Methode selbst werfen könnte.

Um herauszufinden, was die Methode macht, muss man leider alles lesen. Und tatsächlich findet man das:
"Sets the read timeout to a specified timeout, in milliseconds. A non-zero value specifies the timeout when reading from Input stream when a connection is established to a resource. If the timeout expires before there is data available for read, a java.net.SocketTimeoutException is raised. A timeout of zero is interpreted as an infinite timeout."
 
auch diese Exception aber, um meinen Punkt nochmal zu betonen, nicht bei der simplen set-Methode die nur einen Wert ablegt,
sondern erst bei Ausführung von getInputStream() usw.
 

Zurück
Oben