# Website-Zugriff beenden



## Johzi (21. Jan 2013)

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.


----------



## SlaterB (21. Jan 2013)

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


----------



## Daassan (21. Jan 2013)

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


----------



## Johzi (21. Jan 2013)

Ich benutze eine Klasse die ich hier: Content einer Webseite parsen @ Java - tutorials.de: Tutorial, Forum, Anleitung & Hilfe
gefunden habe nur leicht modifiziert.


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


----------



## SlaterB (21. Jan 2013)

URL, diese komische Variante, ich habe es fast befürchtet, mit der werde ich mich wohl nie anfreunden,

immerhin liefert 'java url timeout' in Suchmaschinen unendlich viele Links, etwa

Java URLConnection Timeout - Stack Overflow
Alternative to java.net.URL for custom timeout setting - Stack Overflow


----------



## nillehammer (21. Jan 2013)

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]


----------



## Johzi (21. Jan 2013)

und ich bekomm als return Wert dann null wenn ich einen Timeout habe.
Also wenn ich es so 

```
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?


----------



## nillehammer (21. Jan 2013)

> 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.


----------



## Johzi (21. Jan 2013)

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.


----------



## SlaterB (21. Jan 2013)

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.


----------



## nillehammer (21. Jan 2013)

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."


----------



## SlaterB (21. Jan 2013)

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.


----------

