# "Ende eines Sockets"



## Kinimod (11. Nov 2007)

Hi Leute, 

habe nur mal kurz ne definitionsfrage.
und zwar wenn ich als client mithilfe eines InputStream-Objekts und der zugehörigen Methode read(byte[] b) den OutputStream eines Servers abhorche, dann gibt mir read ja solange die anzahl der gelesenen bytes aus, bis laut definition "das ende des streams" erreicht ist.
aber was genau ist dieses "ende des streams" ?

kurzer code, damit ihr auch verstehen könnt, warum ich die frage stelle (ausschnitt aus dem client-code):


```
String message=null;
try {
    int length;
    byte[] buffer=new byte[4096];
    message="";
    while((length=in.read(buffer))!=-1) 
        message=message+new String(buffer, 0, length);
    return message;
}
catch(Exception e) {
    return message;
}
```


so, nun ist der server allerdings so strukturiert, dass er permanent mit dem client verbunden ist, d.h. jederzeit der OutputStream zum Clienten offen ist.
Mein Anliegen ist es nun, dass der Server irgendwas sendet, der client empfängt es mithilfe des oben dargestellten codes und springt auch anschließend aus der schleife raus, und bleibt nicht in der whileschleife hängen und wartet einfach auf weiteren input ^^.
und genau hier steckt mein problem, denn obwohl an sich ja keine daten vom server mehr kommen, wartet die methode read ja auf weitere und blockiert den prozess ...

habe das ganze jetzt mittels socket.setSoTimeout() gelöst, allerdings finde ich das irgendwie unelegant und hoffe, dass mich eine genaue definition von "ende des streams" weiterbringt.



Vielen dank schonmal im voraus an alle


Dominik


----------



## tuxedo (12. Nov 2007)

ende des streams = -1 available bytes
bzw.
eine SocketClosedException oder eine IOException. 

Wenn die Kommunikation vom Server zum Client beendet ist, kannst du entweder auf Serverseite oder auf Clientseite ein .close() auf dem Socket machen. Dann ist auch das Ende des Streams erreicht.

- Alex


----------



## Kinimod (12. Nov 2007)

Danke erstmal für die antwort.
gibt es denn mit dem normalen InputStream irgendeine möglichkeit zu überprüfen, ob noch bytes im stream drin sind ?
weil available gibt hier ja immer nur 0 zurück ....


----------



## Kinimod (12. Nov 2007)

oder ich schau einfach mal ob nicht in.read()==0 zum ergebnis führt, ist mir 2 sekunden nach erstellung des vorigen posts eingefallen ^^


----------



## Kinimod (12. Nov 2007)

nein das geht ja leider nicht, weil ja immer der letzte ausgelesene wert von length gespeichert bleibt ...
also bitte lösungsvorschläge, verzweifle hier schon voll


----------



## tuxedo (12. Nov 2007)

wenn availavle() nur 0 zurück liefert, liegt das schlicht und einfach daran, dass es nix zum lesen gibt. Das funktioniert bei mir bisher 100,00% zuverlässig.

Wenn du das Ende des Streams ermitteln willst, warte auf eine Exception die bei einem read-vorgang auftritt bzw schau was available() zurückgibt. 

Mehr gibts dazu nicht zu sagen. Und mehr Lösungswege sind mir auch nicht bekannt.

- Alex


----------



## Kinimod (12. Nov 2007)

alex0801 hat gesagt.:
			
		

> wenn availavle() nur 0 zurück liefert, liegt das schlicht und einfach daran, dass es nix zum lesen gibt. Das funktioniert bei mir bisher 100,00% zuverlässig.
> 
> Wenn du das Ende des Streams ermitteln willst, warte auf eine Exception die bei einem read-vorgang auftritt bzw schau was available() zurückgibt.
> 
> ...




das ist so wie du das sagst laut der java-API nicht korrekt.



> available
> 
> public int available()
> throws IOException
> ...




habe das worauf es mir ankommt nochmal rot hervorgehoben. das verdeutlicht, dass mein problem nicht mit available gelöst werden kann ...


Gibt es vielleicht noch andere vorschläge ?


----------



## tuxedo (13. Nov 2007)

Gut, irren ist menschlich. Aber statt drauf rum zu reiten: Wieso suchst du nicht gleich weiter in der API-Doc? Okay, was heisst suchen. Du hättest nur selbst die Augen etwas weiter aufmachen müssen, dann wärst du nämlich hier drauf gestoßen:



			
				http://java.sun.com/javase/6/docs/api/java/io/InputStream.html#read() hat gesagt.:
			
		

> read
> 
> public abstract int read()
> throws IOException
> ...



Das selbe findest du bei allen read-Methoden von InputStream. 

Im Zweifelsfall wirst du noch rechtzeitig eine Exception bekommen. Aber das hab ich ja glaub auch schon mehrfach erwähnt.


----------



## Kinimod (13. Nov 2007)

alex0801 hat gesagt.:
			
		

> Gut, irren ist menschlich. Aber statt drauf rum zu reiten: Wieso suchst du nicht gleich weiter in der API-Doc? Okay, was heisst suchen. Du hättest nur selbst die Augen etwas weiter aufmachen müssen, dann wärst du nämlich hier drauf gestoßen:
> 
> 
> 
> ...




ja das read bei dem end of stream -1 zurück gibt war mir ja klar, nur mein problem ist halt, dass der gegensocket überhaupt nicht geschlossen wird, sondern die verbindung weiterhin bestehen bleibt, was wiederum bedeutet, dass der fall "end of socket" überhaupt nicht eintritt.
mir geht es einfach nur darum eine möglichkeit zu finden, mithilfe derer ich überprüfen kann, ob MOMENTAN noch bytes im stream vorhanden sind. 
und bisher bin ich halt auf keine brauchbare funktion oder methode in der api gestoßen ... 

und falls es dir so erschienen ist, dass ich auf deinem "fehler" rumreite, dann kann ich nur sagen, dass es von mir überhaupt nicht so gemeint war. ich wollte lediglich auf die tatsache hinweisen, dass diese lösung wie von dir vorgeschlagen (leider) nicht funktioniert.
falls es anders rübergekommen ist, möchte ich mich für das missverständnis und meinen evt. unangebrachten "tonfall" entschuldigen.


Dominik


----------



## tuxedo (14. Nov 2007)

Hast du das mit dem -1 mal ausprobiert? 

Auf was willst du eigentlich hinaus?
Du schreibst du willst den OutputStream am Server "permanent" zum Client offen halten. Solange der OutputStream aber offen ist, wird NIE das Ende des Streams erreich. 

Machst du ein close() auf den OutputStream fliegt dir am Client der "End of Stream" bzw. eine Exception um die Ohren, die besagt "stream closed". 

Solange du also am Server den Stream nicht "beendest", kriegt der Client auch kein End of Stream. 

Stream heisst ja so viel wie Strom. Stell dir also einen Wasserstrom vom Server zum Client vor. Da fließt die ganze Zeit Wasser ... ununterbrochen. Wenn du was auf den Strom "draufschreibst" gleich das einer Flaschenpost die du am Server in den Fluss wirfst und am Client wieder rausfischst.

Was du jetzt versuchst ist, am Server dem Fluss NICHT den Hahn zuzudrehen, und am Client trotzdem ein "Hey, da kommt kein Wasser mehr" festzustellen. Das geht halt einfach nicht. 

Mach den Strom am Server dicht, dann kriegt das der Client auch entsprechend mit. Fertig.

Hoffe ich konnte die Sache etwas "aufhellen".

- Alex


----------

