PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Read auf Socket blockiert programm???????????



nul
20-09-2006, 18:53
Ich sitz schon seit einiger Zeit an ner App und was mir nocht wirklich dazu fehlt ist das Handling zur Netzwerkschnitstelle.
Das baue ich gerade ein und bin da auf ein Problem gestossen!
Und zwar erzeuge ich mit

this.socket = new Socket( this.hostOrAddress, this.port );
die Verbindung zum Server, mit dem ich mich verbinden muss.
Dann erzeuge ich mit

this.writer = new PrintStream( this.socket.getOutputStream() );
InputStreamReader streamReader = new InputStreamReader( this.socket.getInputStream() );
BufferedReader reader = new BufferedReader( streamReader );

die Streams zum lesen und schreiben und fange dann in einem Thread sofort an zu lesen.

while ( true ) {
if ( ( line = buffer.readLine() ) != null ) {
....
}
}
und an der Stelle blockiert ploetzlich mein programm :confused:
Er faengt auch an zu lesen, liest die ersten zeilen ein die versendet werden wenn man eine Verbindung zum Server aufbaut (aus dem was er erhaelt macht er bis noch nichts, der Code ist zwar vorhanden, aber das was er empfaengt wird nicht als gueltige nachricht fuer mein Programm ausgewertet und deshalt verschmissen).
Das lesen laeuft wie schon gesag in einem Thread ab, deshalb versteh ich nicht genau wieso er blockiert.
Sofort nach dem starten des Threads sollte eine weitere Methode eine Nachricht an den Server schicken, aber diese wird nicht mal aufgerufen ....

Fuer mich ist das ganze ein ziemliches raetsel warum das ganze blockiert! Hat jemand vielleicht eine Idee woran das noch liegen koennte?

lg
nul

falke2203
20-09-2006, 21:03
Was da blockiert ist das Lesen... Das Problem könnte schon gelöst sein, indem du deine Schleife so (um-)schreibst:


while ((line = buffer.readLine()) != null) {
...
}

nul
21-09-2006, 18:35
Leider loest das das Problem auch nicht.
Meiner Meinung nach muesste das ja eigentlich die while-Schlefe abbrechen, wenn nichts mehr zu lesen ist ... aber genau das passiert auch nicht?
Mal ne Frage, readLine() blockiert doch nicht, oder? In der API hab ich dazu beim ueberfliegen leider nichts gefunden!

falke2203
21-09-2006, 19:01
Wenn mein Änderungsvorschlag das Problem nicht löst (in deiner Variant hätte die Schleife nie terminiert, da true irgendwie immer true ist :) ), dann solltest du serverseitig mal schauen, ob da irgendwann aufgehört wird in den OutputStream zu schreiben. Weil: read()-Methoden von InputStreams blockieren tatsächlich...

This method blocks until input data is available, the end of the stream is detected, or an exception is thrown. (zitiert von -> hier <-) (http://java.sun.com/j2se/1.5.0/docs/api/java/io/InputStream.html#read())

nul
22-09-2006, 08:05
ok, nach einer laengeren Pair-Programming sitzung mit dem Entwickler des Servers haben wir dann doch noch einige Fehler entdeckt.
Zwar nicht unbedingt Fehler die mit dem hier zu tun haben, aber wer weiss.

lg
nul