# readline-thread stoppt vorzeitig



## schoppenhauer_entfernt_ (23. Apr 2006)

Hallo. Ich versuche grad einen IRC-Bot zu schreiben... bin aber momentan noch in der "Experimentierphase"... und... tja...  ich habe ein Problem. Der folgende Code

```
public void run () {
	    String buffer;
	    try {
	    ircin = new BufferedReader (
		new InputStreamReader (s.getInputStream()));
	    do {
	     if ((buffer = ircin.readLine())!=null) {

		//Ping-Pong
		if (buffer.substring(0, 5).equals("PING ")) {
		    ircout.println("PONG " +
				   buffer.substring(6, buffer.length()-6));
		    System.out.println("PINGPONG - \"" + buffer + "\"");
		} else {
		    System.out.println("Message>"+buffer);
		    }}
	     System.out.print("*"); //<-----Kontrolle
	    } while(true);
	    } catch (Exception e) {
		System.out.println("Fehler in run(); !");
	    }
	}
```
den ich vorher mit

```
Thread t = new Thread(this);
	t.start();
```
starte (die klasse implementiert Runnable) sollte eigentlich in einem Endless-Loop immer wieder die Messages vom Server ausgeben.
Um zu überprüfen ob der loop auch funktioniert habe ich das 
	
	
	
	





```
System.out.print("*"); //<-----Kontrolle
```
 eingefügt...
Nunja... es geht nicht immer... Also der Loop geht seltsamerweise nur teilweise - wann genau kann ich nicht sagen... ich sehe da keinen Zusammenhang.
Jedenfalls... Mir gibt das Ding auch absolut NICHTS aus. Abhängig vom Server gibt es mir mal die erste Zeile aus, die der Server sendet, mal garnichts. Ein Fehler ist nie da - der server scheint connected zu bleiben.

Ich möchte eigentlich nur dass mir alles was der Server sendet ausgegeben wird. Und ich hab leider keine Ahnung was ich falschmache.
Kann mir jemand helfen?


----------



## The_S (24. Apr 2006)

1. "s" ist dein Socket!?
2. Wenn der Server nichts mehr sendet gibt der InputStream auch nicht -1 zurück sondern erst wenn der Socket bzw. Stream geschlossen wird. Kann es also evtl. sein dass der Fehler auf der Serverseite liegt?

[edit]

3. der Thread stoppt vorzeitig oder es wird einfach nichts mehr ausgegeben?


----------



## schoppenhauer_entfernt_ (24. Apr 2006)

Sorry. Ja, s ist mein Socket.
Hm. Woran kann ich denn erkennen wenn der Server meine connection beendet?

Dass es ein Serverseitiges Problem ist, glaub ich mal nicht... ich habe mehrere richtige Server ausprobiert, dann bitlbee, etc. Hat bei allen nicht wirklich funktioniert. Daraus schließe ich mal, dass der Fehler bei mir liegt. Aber: Ich führe diesen Thread aus, bevor ich an den Server direkt sende - um eben alle Fehlermeldungen zu sehen, die er mir ausgibt. Ich sehe MANCHMAL den Anfang der MOTD... Mehr nicht.

Also ob er stoppt weiß ich nicht. Die Sternchen (die ich ja nur zur kontrolle habe) werden nicht ausgegeben. Die Sternchen sollten eigentlich unabhängig vom Rest IMMER ausgegeben werden. Warum dem nicht so ist, weiß ich nicht. Ich schließe mal daraus, dass der Thread gestoppt wird oder irgendwas ihn blockiert.


----------



## schoppenhauer_entfernt_ (24. Apr 2006)

Ok... Danke.
Ich habe inzwischen durch zufall selber rausgefunden, dass man anscheinend den Output-Stream flushen muss... Wusst ich nicht. Im Moment funktionierts.
Die Frage, die sich mir aber immernoch stellt ist: Wie erkennt man dass der Server nichts mehr sendet?
Also ich erkenne es momentan daran, dass einfach der thread nur noch sternchen ausgibt... aber wie kann ich das mit dem programm feststellen?


----------



## The_S (25. Apr 2006)

imho gar nicht. Du bekommst nur mit wenn die Connection geclosed wird. Joa, OutputStream muss geflushed werden wenn er gebuffert ist. Das ist aber überall so, nicht nur bei Sockets.

Was mich noch verwundert, dass du Sternechen ausgegeben bekommst. Weil normalerweiße müsste sich der BufferedReader so lange blockieren bis wieder was gesendet wird => Du dürftest nur Sterne ausgegeben bekommen wenn der Server auch vorher was gesendet hat  :shock:


----------



## schoppenhauer_entfernt_ (25. Apr 2006)

Ok. Und wie bekomm ich mit wenn die geclosed wird?


----------



## The_S (26. Apr 2006)

Du kannst überprüfen ob der Socket geschlossen ist mit socket#isClosed(); und ansonsten wenn deine readLine() Methode eine Exception wirft  :bae: .


----------

