Datenpaketproblem

Status
Nicht offen für weitere Antworten.
P

pansenn

Gast
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 [])
Bedeutung: "Hallo" zum Server, Server antwortet mit ID 81h

ID: 02h
Length: 2*(Anzahl Zeichen in Nickname)
Data(Typ): Nickname (char [])
Bedeutung: Anmelden mit Nickname, Server antwortet mit ID 82h

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

Aktives Mitglied
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
 
G

Gast

Gast
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

Top Contributor
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

Bekanntes Mitglied
@ 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
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben