# Blockierender ByteArrayStream



## mabuhay (1. Mrz 2011)

Hallo

Ich habe ein paar Probleme mit den ByteArrayStreams. Die Streams sollen für eine Client<->Server-Verbindung verwendet werden. 

*1. Problem:*
Ich erstelle einen neuen Input-Stream mit z.B. 

```
new ByteArrayInputStream(new byte[250]);
```
Die Server->Client Verbindung wird hergestellt und ich versuche aus dem Input-Stream daten herauszulesen (exception-handling hier nicht im code):

```
while ((readBytes = bin.read(b)) >= 0) {
				System.out.println("just got " + readBytes + " bytes");
}
```
Nun lese ich aber immer die Anzahl Bytes (alle haben den Wert 0), welche ich beim erstellen des Streams angegeben habe (hier 250 bytes). Bei weiterem Lesen wird -1 zurückgegeben (EOF).

*2. Problem:*
Die Server<->Client Verbindung besteht noch aber die read-Methode gibt -1 zurück (siehe Problem 1). -1 Bedeutet doch dass die Verbindung nicht mehr besteht oder?

*3. Problem*
Ich möchte dass der ByteArrayInputStream blockiert wenn keine Daten kommen (wie beim ObjectInputStream). Ist das möglich? Ich habe erwartet dass der Stream -1 zurück gibt wenn die Verbindung nicht mehr besteht, sonst wird aber blockiert wenn keine Daten dort sind (oder wie beim ObjectInputStream gibts ein read-timeout).

*4. Problem*
Ich weiss nicht ob das überhaupt Möglich ist, aber wäre natürlich sehr Praktisch. Ich suche einen Weg wie ich feststellen kann dass Daten ankommen, damit ich das Ankommen der Daten signalisieren kann und erst nachher die Daten auslesen kann. Die Methode available() gibt zum Beispiel die Anzahl Bytes aus welche gelesen werden können, die Methode Blockiert aber nicht. Am besten wäre eine Methode welche Blockiert und sobald Daten hereinkommen die Blockierung aufhebt. Falls es Möglich ist dass der ByteArrayInputStream blockiert (siehe obige Probleme) könnte ich einfach erst mal 1 Byte auslesen, dann das Ankommen von Daten Signalisieren und den Rest auslesen. Toll wäre aber natürlich wenn es sowas auch für den ObjectInputStream gäbe.

ich hoffe jemand kann mir diese Fragen beantworten. Evtl hab ich auch irgendwo etwas falsch in der Verbindung, da die rückgaben von -1 mir ein wenig komisch vorkommt. Ich habe schon erfolgreich Objekte versendet (einfach den ByteArrayStream mit ObjectStream vertauscht und natürlich sende und empfangsmethoden angepasst).

mfg


----------



## SlaterB (1. Mrz 2011)

ein [c]new ByteArrayInputStream(new byte[250]);[/c] liest genau 250 Bytes aus dem gegebenen Array, kein byte mehr, kein byte weniger, und gibt danach -1 zurück,
mit einer Client/Server-Verbindung hat das überhaupt nichts zu tun!

wenn du was aus einem Socket lesen willst, dann geht das mit [c]socket.getInputStream()[/c],
alle weiteren Fragen erübrigen sich mehr oder weniger, dass ein ByteArrayInputStream niemals blockieren kann ist ganz logisch,
aus dem Socket kannst du blockierend lesen


----------



## mabuhay (2. Mrz 2011)

Achsoooooo oh mann ja... jetzt sehe ichs natürlich...

Ich hab einfach meinen InputStrem mit dem ByteArrayInputStream überschrieben und irgendwie gedacht dass dies dann auch mit dem Socket verknüpft ist, auch wenns nicht mal den InputStream als argument hat... zu dumm

Vielen Dank für die Hilfe


----------

