# Datenpaketproblem



## pansenn (15. Jul 2006)

Hallo zusammen.
Wir müssen für die Uni ein Chat Client programmieren. Gefordert ist:



> Die Kommunikation mit dem Server erfolgt mit Datenpaketen, die aus einer Folge von Bytes bestehen, die in drei Felder unterteilt ist : ID (1 Byte), Length (2 Bytes) und Data (so viele Bytes, wie Length angibt).
> Die Felder werden in der Reihenfolge ID, Length, Data übertragen. Das Feld ID gibt die Art des Pakets an, das Feld Length die Länge des Feldes Data und das Feld Data enthält die eigentlichen Daten, die je nach Inhalt des Feldes ID unterschiedlich zu interpretieren sind (genaue Beschreibung auf der nächsten Seite). Datentypen, die länger als ein Byte sind, werden in Big-Endian-Reihenfolge übertragen. Der Server läuft auf ***** und nimmt einfache TCP-Verbindungen auf Port 8182 an.



Hier mal zwei Beispiele:



> Pakete vom Client zum Server:
> ID: 01h
> Length: 8
> Data(Typ): {53h,6Bh,69h,4Ch,4Ch,6Fh,72h,5Ah} (byte [])
> ...



Jetzt mein Problem:
Wie sehen diese Pakete aus. Ist die ID ein String ? Oder wird nur das 01 als byte geschickt ?
Bei Length geb ich ja nur an wie viele Zeichen in der Nachricht sind. Warum brauch ich dann acht wenn Hallo doch nur fünf Buchstaben hat ?
Und bei Data wieder das Problem mit den h's. Was ist z.B 53h ? Stellt das ein Buchstabe dar ?
Sorry für meine (wahrscheinlich) komischen Fragen, aber ich steig da grad überhaupt nicht mehr durch.
Also danke schon mal im Vorraus!


----------



## motschow (22. Jul 2006)

Vielleicht bedeutet das h, dass es sich um eine Hexadezimalzahl handelt?
In Assembler zum Beispiel findet man diese Zahlen als Interruptnummern z.B. interrupt 21h für Betriebssystemfunktionen
_ MOV AH,02h
MOV DL,'A'
INT 21h_ gibt das zeichen "A" auf dem bildschirm aus


----------



## Gast (26. Jul 2006)

die ID wird einfach als byte geschickt, also ne zahl

Und die länge der zeichen ist mal 2 da die zeichen im unicode sind und das braucht halt 2byte für ein zeichen und nicht nur eins wie im ascii code

und ja das h heisst hexadezimal


----------



## foobar (26. Jul 2006)

> Bei Length geb ich ja nur an wie viele Zeichen in der Nachricht sind. Warum brauch ich dann acht wenn Hallo doch nur fünf Buchstaben hat ?


Weil  2(Length) + 1(ID) + 5(Data) = 8 ist.



> Wie sehen diese Pakete aus. Ist die ID ein String ? Oder wird nur das 01 als byte geschickt ?


Du verschickst immer einzelne bytes. Das kannst du ganz einfach über den Outputstream mit write(byte[]) realisieren. Zuerst baust du dein byte[] auf und dann übergibst du es einfach der write-Methode.


----------



## muckelzwerg (26. Jul 2006)

@ foobar : ? *rechnungnichtpeil*

Ich seh das eher so :
ID : 01h = "1" oder Start of Heading.
Wird genommen um den Typ der Nachricht zu codieren.
Length : 8 = Ist die Länge des Nachfolgende Datenstroms in Bytes.
(steht übrigens so in der Aufgabe)
Das ist nötig um das Paket sauber abzutrennen.
Auf Newlines und son Quark kann man sich ja nicht verlassen.
Data : enthält die Payload. 
Im ersten Fall ist das eine Sammlung von 8 Charaktern, angegeben in hexadezimaler Schreibweise und gespeichert als Byte Array :
53h,6Bh,69h,4Ch,4Ch,6Fh,72h,5Ah = S k i l l o r Z
(nachzuschauen bei www.asciitable.com)
Somit ist die Länge = 8, da 8 Bytes.
Im zweiten Fall sind die Daten in einem char[] Array enthalten.
Ein char = 2 Bytes in java (Unicode).
Daher ergibt sich dort die doppelte Länge also
2 * Anzahl Zeichen.

Verschicken solltest Du alles über Bytes, und auch so auslesen.
Die ID ist verm. immer ein Byte lang, die Längeninformation muss
ebenfalls eine feste Länge haben.
(Unterschiedliche Größe der Längenangabe, durch unterschiedliche ID ist eine Lösung, wenn die Länge nicht reicht. Oder Sequenzen aus Paketen bauen und durch entsprechende IDs kennzeichnen. ...)
Die Beiden Werte holst Du also immer nach Schema F.
Dann nimmst Du den Längenwert für dein read() um die Daten zu bekommen.
(http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStream.html#read(byte[],%20int,%20int))


  --  --  muckelzwerg


----------

