# Komprimierte Sockets



## Hatschi (12. Aug 2010)

ich habe eine Frage betreffend folgendem Skript (CompressedSocket.java):
Battleship - Netzwerkprogrammierung in Java

ich verstehe die Methoden "read(byte[] b)" und "write(byte[] b)", sowie die Konstante DEFAULT_SYNC_SIZE_GZIP_BYTES nicht ganz. Kann mich einer aufklären?

(-> was soll das: "cbis_.read( b, 0, b.length );" bzw. wo wird die Aufteilung der oben genannten Metadaten realisiert?)


----------



## SlaterB (13. Aug 2010)

kennst du denn grundsätzlich Streams?
kann man in einem Lehrbuch nachlesen
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 14.3 Stream-Klassen und Reader/Writer am Beispiel von Dateien
naja, vielleicht nicht allzu deutlich,

es geht jedenfalls um das Schreiben und Lesen von Daten, z.B. in Form von byte[], das ist die übliche Übertragungsform derartiger Daten,
read und write machen sowas, read( b, 0, b.length ) ist nicht viel anders, der zweite und dritte Parameter gibt an, von wo bis wo das Array zu beschreiben ist, Anfang bis Ende, nicht sehr spannend

bei dem CompressStreams kann man mit DEFAULT_SYNC_SIZE_GZIP_BYTES angeben, ab wieviel bytes die Daten komprimiert und versendet werden sollen,
je länger erst Daten gesammelt werden, desto besser lassen sich die großen Mengen Bytes komprimieren, aber das kostet auch Speicher zum Sammeln und der Empfänger erhält erstmal gar nix, und dann den ganzen Berg aufeinmal, 
komprimiert ist es zunächst nicht so viel, kann aber möglicherweise erst entpackt werden wenn alles da ist und auch beim Empfänger entstehen dann große Datenmengen, die zwischengespeichert werden müssen,
bei flush() wird immer gesendet, auch wenn nur wenige bytes da sind,

die Metadaten sind intern im Compress-Stream, muss dich eigentlich nicht interessieren,
hier habe ich den Quellcode gefunden:
JavaTechniques  Compressing Data Sent Over a Socket
da sieht man wie die 8 Bytes gesendet und empfangen werden, beschreiben die Länge der Daten, 
ist schon wichtig wann alles da ist, wann entpackt werden kann usw.


----------



## Hatschi (13. Aug 2010)

bedeutet das, wenn ich zB. einen Chat programmiere, dass dann nicht alles geschickt wird und sondern mit dem senden des letzten Blockes immer erst gewartet wird, bis ich auch er voll / die richtige Länge hat?
Und wenn ja, wie kann ich das verhindern? Mit flush()?


----------



## SlaterB (13. Aug 2010)

alles richtig,
bei Chat komprimiert man auch eher selten, vermute ich


----------



## Hatschi (13. Aug 2010)

mh, da ist was wahres dran^^


----------

