# Vom Server per Socket Empfangen, aber wieviel Bytes?



## Mondmann1 (20. Dez 2005)

Hello.
Ich habe eine Socket Kommunikation mit einem Server.
Ich sende was und bekomme natürlich was zurück.

Dafür verwende ich read().
Den Empfangspuffer muss ich vorher festlegen, also:


```
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
char []cread= new char[1024];
reader.read(cread,0,1024);
```

Jetzt ist der Buffer aber auf jeden Fall 1024 Bytes groß, auch wenn ich nur 100 Bytes empfange.
Ich möchte aber, daß ich den maximalen Buffer festlege, in diesem Falle 1024 und wenn ich nur 100 Empfange, nachher auch einen String habe der 100 Zeichen groß ist.

ZB, in C knallt der Server mir ein '\0' hintendran und das ist dann der Stringende.
Ergo 100 Zeichen.

Wie mache ich das mit Java?

Danke schonmal Mondmann


----------



## Bleiglanz (20. Dez 2005)

schau mal den Rückgabewert von read an...


```
public static String readToEnd(final InputStream in, final String charset)
            throws IOException {
        final BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset));
        final StringBuilder result = new StringBuilder(8192);
        final char[] charBuffer = new char[8192];
        int readChars = 0;
        while (-1 != (readChars = reader.read(charBuffer))) {
            result.append(charBuffer, 0, readChars);
        }
        reader.close();
        return result.toString();
    }
```


----------



## Mondmann1 (21. Dez 2005)

> schau mal den Rückgabewert von read an...



..der ist bei mir 1023.
Beim C Äquivalent ist er 25, da ich auch nur 25 Zeichen Empfange.
 :bahnhof: 
Mondmann


----------



## Bleiglanz (21. Dez 2005)

was ist denn das für ein Server?

und was schickt der??

wenn der Server in C geschrieben ist und der nach \0 einfach weitersendet dann musst du das in deinem Java-Client manuell abfangen...


----------



## Mondmann1 (21. Dez 2005)

Yupp ein in C++ geschriebener Server.
Er sendet zwar die ganze 1023 Bytes, aber er schickt zB. "HALLO DU DA\0\0\0\0... "und füllt den Rest auf mit '\0'.
Aber er sendet immer 1023 Bytes.

Also von Hand abfangen?

Boah ich frag mich echt ob Java das richtige ist für mein Plattformunabhängiges Projekt.
Das Soll unter Linux genauso laufen wie unter MAC OS...

Mondmann


----------



## Bleiglanz (21. Dez 2005)

Was kann Java dafür, wenn der Server nicht richtig arbeitet?

Und: bei einem C++ Server mir irgendeinem selbstgestrickten Protokoll müsstest du die Daten immer manuell verarbeiten...


----------



## Mondmann1 (21. Dez 2005)

Der Server arbeitet schon richtig.
Ich hab eben noch den Knoten im Gehirn, daß '\0' String Ende bedeutet.
Somit habe ich in C sofort meinen entsprechenden String.
So muss ich jetzt jedes Zeichen durchwühlen, vergleichen und bei '\0' das Bytearray abtrennen. Die Zählvariable die mitläuft zeigt mir die Stringlänge an.
Wenn ich ne Entsprechende Anfrage sende und ich bekomme 500x 1023 Bytes an den Latz geknallt bricht die Performance ganz schön ein...
Naja mal sehen...

Vielen Dank trotzdem.

Mondmann


----------



## Bleiglanz (21. Dez 2005)

Was soll daran richtig sein dass der Server soviele \0en schickt

klar: wenn du den ganzen Schrott in einen C/C++ String legst, dann wird der richtig weiterverarbeitet (und die restlichen \0en belegen sinnlos Speicher der nicht weiter stört...)

wenn der Server 500 x 1023 Bytes schickt dann musst du die wohl alle lesen, was anderes bleibt dir gar nicht übrig; von der Performance dürfte das nix ausmachen


----------



## Mondmann1 (21. Dez 2005)

naja ok.
Ich jerne ja schon kräftig dazu. Wenn auch auf Eure /Deine Kosten.
Aber ich empfinde es als extrem schwierig von C nach Java zu kommen.Vor allem was die Stringberarbeitung angeht.
Die schönen Zeiger habe ich ja in Java leider auch nicht

Vergelts Got tund dankeschön.

Mondmann


----------



## JayJay (7. Jan 2006)

PS: Schonmal was von Ansi C++ gehört?

musst ddas teuk nur unter linux nochmal kompilieren


----------



## Mondmann1 (10. Jan 2006)

hm...kannste mir das mal genauer erklären?
Ich bräuchte ja dann alle Bibiotheken usw. auf den linux/MAC Rechner....
Oder wie funktioniert das?

Mondmann


----------



## Gast (10. Jan 2006)

warum lässt du deinen C Server auch so viele \0 senden?
sende eine und feierabend!

dann brauchst in Java bloß noch gucken, wie viele bytes gesendet wurden, davon nimmst das letzte weg (deine \0) und wandelst die restlichen in einen string um....
fertig


----------

