# Eigenes Protokoll: Wie?



## koooala (26. Jul 2007)

Hallo,

ich versuche, mich möglichst kurz zu fassen.

Die Idee für mein Protokoll steht:

Vom Client bekomme ich (der Server) ein paar Bytes unbestimmter Länge. Warum? Ganz einfach.

Mein Protokoll ist grob gesehen so aufgebaut:
[4 Bytes: Art der Nachricht][n Bytes: Parameter abhängig von der Art der Nachricht]

Mein Hauptproblem ist, dass ich nicht genau weiß, wie man das Auslesen angeht. Ich kenne ja leider nicht die Länge der "Einheit".

Demnach muss ich erst die ersten 4 Bytes lesen, analysieren, um welche Nachrichtenart es sich handelt und anschließend nochmal die Parameter auflösen. Das können Integer (4 Byte) oder Strings (4 Byte für die Länge [Integer] + n Byte String) sein.

Der String selbst ist dann auch nochmal nach dem Prinzip aufgebaut: Erst wird die Länge gelesen und anschließend liest man so viel Puffer, wie die Länge... lang ist.

Ich weiß nun nur nicht, wie man generell an selbstdefinierte Protokolle mit Java ran geht.

Ich könnte über den Socket ja erst immer 4 Byte lesen und dann alles auswerten lassen usw.

Nur bewege ich mich damit stark "low-levelig" am Netzwerk.

Ich möchte aber meine Logik von den "Standard" Funktionen abkoppeln. Jemand Vorschläge bzw. ein paar Klassen, die hilfreich sein könnten?


----------



## hupfdule (26. Jul 2007)

Anonymous hat gesagt.:
			
		

> Jemand Vorschläge bzw. ein paar Klassen, die hilfreich sein könnten?


Ein einfacheres Protokoll wählen. Gibt es einen Grund, unbedingt ein binäres, derart komplexes Protokoll zu wählen? Weitaus angenehmer handhabbar wäre XML oder zeilenbasierte Nachrichten (die einzelnen Nachrichten werden als simple Strings verschickt und jede mit \n abgeschlossen).

Solltest du tatsächlich deine Idee umsetzen wollen, wirst du nicht umhin kommen, das alles per Hand zu machen. Dein Ansatz dafür ist dann schon richtig. Immer so viel lesen, bis du weißt, wieviel du noch lesen musst, um den Rest der Nachricht zu erhalten.
Aber wie gesagt, ich würd auf ein anderes Protokoll setzen....


----------



## tuxedo (26. Jul 2007)

Noch ein Vorschlag:

-> Nachricht beginn
1 byte -> Beschreibt welche Art von Nachricht es ist (0..255... Da kannst du genug Nachrichtentypen definieren)
4 byte -> Länge des Bodys der Nachricht
x byte -> der Body der Nachricht. Hier drin sind alle Daten und Infos der Nachricht gespeichert.
-> Nachricht ende

Das mit dem String-Senden hast du ja schon korrekt erkannt. 
Du kannst den Nachrichtenbody aber auch generell in Blöcke fassen. 
Den Block könntest du wieder so aufbauen:

1 byte: Länge des Blockinhalts der noch gelesen werden muss
Wenn dieses byte den Wert 0xFF (sprich 255) hat, dann beschreiben die kommenden 4 bytes die Läge. Ansonsten ist das 1. Byte schon die Länge des Blocks.

Vorteil: Du muss nicht in jedem Block 4 byte "verschwenden" um die länge zu kodieren. Kleine Blöcke brauchen so nur 1 byte statt immer 4 bzw 5 byte (1: 0xFF, 2..5: Länge) um die Blockgröße zu definieren.

@Hupfdule: XML ist "turboeinfach" im Klartext zu lesen und nicht jede Anwendung erlaubt es Zeilenweise zu kommunizieren. Ich denke da an das verschicken von binären Daten.. Da geht's nicht ohne sowas....

Wenn man sich mal ein Rahmenwerk geschrieben hat ist die Kommunikation so auch recht easy ...

- Alex


----------

