# Sockets Verständnisfrage: abwechelnd lesen-schreiben



## TheSunToucher (8. Dez 2005)

Hi,

irgendwie habe ich glaube ich irgendwas grundsätzliches mit Sockets nicht verstanden. Ich möchte mit einer fremden Applikation über Sockets kommunizieren. Meine und die fremde Applikation unterhalten sich über kleine XML-Telegramme. Sowohl die fremde, meine als auch mögliche weitere Applikationen verbinden sich zu einer art Hub, welcher alle ankommenden Nachrichten an alle anderen Verbundenen Applikationen verteilt.

Ich habe also eine kleine Testklasse geschrieben, welche einen Socket öffnet, sich zum Hub verbindet und ein Telegramm schickt. In der fremden Applikation kommt das Telegramm an, wird korrekt verarbeitet, und mir werden mehrere Antworttelegramme geschickt. Über einen Putty den ich zum Hub verbunden habe kann ich alle Telegramme sehen, sowohl die meiner als auch die antworten der fremden Applikation.

Soweit so gut. jetzt zum Problem: Ich schreibe auf den OutputStream des Sockets und warte anschließend auf Antwort, indem ich vom InputStream lese, doch da kommt nichts an und er wartet bis zum Timeout. (Zeile 9 Listing 2)

Hier mal zwei Codeausschnitte: Aufbau des Socket und senden und anschließendes lesen


```
socket = new Socket(host, port);
        socket.setSoTimeout(timeout);
        in = new InputStreamReader(socket.getInputStream());
        out = new OutputStreamWriter(socket.getOutputStream());
```


```
// message schicken
        out.write(message);
        out.flush();
        
        // antwort lesen
        StringBuffer response = new StringBuffer();
        char[] buffer = new char[1024];
        for(int read; (read = in.read(buffer)) >=0; ){
            response.append(buffer, 0, read);
        }
```

Meine eigentliche Frage ist, habe ich irgendwas grundsätzliches nicht verstanden? Kann ich auf dem geöffneten Socket nach belieben abwechselnd lesen und schreiben?

Danke gruß,
Tim


----------



## foobar (9. Dez 2005)

Java-IO ist total nervig. Ich habe mich auch schon oft damit rumgeärgert. Jenachdem welche flush-Methode du benutzt handelt es sich um eine nop. Also flushen ist Glücksache 



> Kann ich auf dem geöffneten Socket nach belieben abwechselnd lesen und schreiben?


Das funktioniert. Http macht das genauso


----------



## TheSunToucher (9. Dez 2005)

Danke für die Antwort.
Ich glaube ich bin einen Schritt weiter, die fremde Applikation sendet nech der Nachricht kein \n und deshalb wartet sich meine read()-Methode tot. Kann ich nicht von einem Stream lesen ohne auf \n zu warten?


----------



## Mag1c (9. Dez 2005)

Hi,

sicher kannst du das. Du mußt nur definiert das Ende der Nachricht erkennen können. Bei readLine liest er eben immer bis zu einem Zeilenende. Aber es gibt ja auch noch die normalen read-Methoden  :wink: 

Gruß
Mag1c


----------



## foobar (9. Dez 2005)

> sicher kannst du das. Du mußt nur definiert das Ende der Nachricht erkennen können. Bei readLine liest er eben immer bis zu einem Zeilenende.


Das war bei mir auch das problem, deshalb habe ich eine EndenachrichtPI(<?END?>) angehängt, dann klappt das viel besser.


----------

