# Protokoll



## Tomate_Salat (22. Jul 2010)

Hi,

ich hab zwar einiges dazu gefunden, aber das richtige war nicht dabei. Jz habe ich mir mal selbst Gedanken gemacht und auch ein Protokoll auf die Beine bekommen. Ich habe mal die Bytes von meinem 1 Protokolll, meinem 2ten protokoll und dem ObjectOutputStream verglichen:

Für das gleiche Objekt:
Protokoll v1: 54 Bytes. Nach Optimierung 48 Bytes
Protokoll v2: 21 Bytes
ObjectOutputStream: 122Bytes(!)

Ich bin also schon auf dem richtigen Weg . Beispiel wie mein Protokollschema ausschaut:
[c]7|2|Foo Bar12[/c]
Mein Objekt kennt 2 Methoden: getName(); getAge();
Das Protokoll lese ich so aus: [LÄNGE DES NAMENS]|[LÄNGE DES ALTERS]|[NAME][ALTER]

Für String, Integer etc mag das noch ganz gut klappen, aber was ist wenn ich mal zusätzliche Objekte übermitteln will. 

Gibt es vllt einen bessern Weg, sein eigenes Protokoll zu entwickeln?

MFG

Tomate_Salat


----------



## XHelp (22. Jul 2010)

Tomate_Salat hat gesagt.:


> Für String, Integer etc mag das noch ganz gut klappen, aber was ist wenn ich mal zusätzliche Objekte übermitteln will.



Meinst du jetzt noch ein anderes Paar von (alter, name) oder völlig andere Objekte?


----------



## Tomate_Salat (22. Jul 2010)

Ich spreche von Objekten. Ich bin gerade dabei mir für einfache Datentypen eine SuperKlasse zu schreiben, die anhand von Beans diese Daten erkennt und daraus das Protokoll schreibt. Muss nur noch das Zurückparsen richtig bekommen


----------



## ice-breaker (23. Jul 2010)

Google Protobuf?

Oder eben ein eigenes binäres Protokoll:

```
---------------------------------------------------------
| 4 Byte Länge | 1 Byte Object Id | ... object data ... |
---------------------------------------------------------
```

womit ich dein Protokoll bei den meisten Eingaben toppe:

```
class ABC {
  public String foo = "Foo Bar";
  public int num = 12;
}
```


```
--------------------------------------------------------------------------------------------------------
| 55 (4 Byte: Länge) | 1 (1 Byte: Object Id)| 7 (4 Byte: Stringlänge) | Foo Bar (7 Byte) | 12 (4 Byte) |
--------------------------------------------------------------------------------------------------------
```
sind zwar 24 Byte (also 3 mehr als du), wenn ich aber Integer übertrage die eine ganze Ecke größer sind gewinne ich wieder. Oder ich die Datentypen restriktiver vergeben kann (Längenangabe geringer)

Die Object Id dient beim deserializieren als Information, was wo gespeichert ist. Elemente variabler Länge (Strings) brauchen eine extra Angabe


----------



## XHelp (23. Jul 2010)

Du könntest die DNS angucken, da läuft es ähnlich ab, vllt gewinnst du die eine oder andere Idee.


----------



## Wildcard (23. Jul 2010)

Super Framework um eigene Protokolle zu implementieren:
Net4j - Eclipsepedia
Nimmt dir alle Low-Level Themen weitgehend ab, die Transport Schicht lässt sich transparent austauschen (zB TCP, HTTP, In-Memory,...). Dank (De-)Multiplexing kannst du sogar mehere Protokolle über den gleichen Kanal laufen lassen.


----------



## Tomate_Salat (23. Jul 2010)

Sieht interessant aus, danke. In meinem Blog habe ich angefangen, meinen [c]SimpleParser[/c] zu veröffentlichen an dem ich gerade Arbeite. An dem werde ich noch ein bisschen Arbeiten und für meine Anfangsprojekte(übungen) wird der sicherlich ausreichen. Für größere Projekte werde ich dann auf fertige FW's zurückgreifen.


----------



## maki (23. Jul 2010)

Netty wäre auch eine Möglichkeit: Netty - the Java NIO Client Server Socket Framework - JBoss Community


----------



## ice-breaker (24. Jul 2010)

er will kein TCP-Framework sondern Objekte effizient serializieren, und das muss man in Netty auch immernoch selbst mit En- und Decodern machen.


----------



## Tomate_Salat (29. Jul 2010)

Wildcard hat gesagt.:


> Super Framework um eigene Protokolle zu implementieren:
> Net4j - Eclipsepedia
> Nimmt dir alle Low-Level Themen weitgehend ab, die Transport Schicht lässt sich transparent austauschen (zB TCP, HTTP, In-Memory,...). Dank (De-)Multiplexing kannst du sogar mehere Protokolle über den gleichen Kanal laufen lassen.



Wollte mir mal die Tutorials anschauen und die sind echt Klasse :lol::


> This is an empty stub. Please feel free to add appropriate content.


:applaus:

Naja, vllt finde ich ja noch etwas, was mir einen Einstieg in die Sache erleichtern würde^^.


----------



## Wildcard (29. Jul 2010)

Tomate_Salat hat gesagt.:


> Wollte mir mal die Tutorials anschauen und die sind echt Klasse :lol::


Im Eclipse CVS liegen Examples für ein Echo Protokoll, einen File Upload und ein Buddy Example (Chat). Die Sache ist wirklich recht einfach.


----------



## Tomate_Salat (29. Jul 2010)

Bin durch diesen Thread auf gson gekommen. Da könnte ich JSON ganz nett übers Netzwerk senden. Es wäre zwar ein größeres Paket, als dass was ich bis dato mit meinem SimpleParser versende, aber immernoch wesentlich kleiner als der OOS/OIS.


----------



## ice-breaker (30. Jul 2010)

binäre Protokolle (mehr Aufwand, weniger Daten) oder Datenstrukturen wie json/yaml durch gzip gejagt, denke ich, ist am optimalsten.

Die ersten 2 Byte einer gzip-Kompression geben nämlich zugleich die Länge die gesamte Länge der Kompression an, damit kann man wunderbar die Daten von einem Stream laden.


----------



## Tomate_Salat (30. Jul 2010)

ich bin auch gerade an einer weiterentwicklung von meinem dran, was nicht auf getter/setter setzt, sondern direkt auf variablen geht (egal welcher modifer) und nicht mehr geerbt werden muss. Das parsen geht schon relativ gut, dabei ist das Muster beispielsweise:


```
[{1|5}1hallo]
```
     selbes prinzip wie oben, nur die indexzahlen werden besser hervorgehoben + [] markieren jz ein Objekt, somit ist auch soetwas möglich:

```
[{1|13}2[{1|5}1hallo]]
```
Also könnte ich einfache Objekte mit übergeben. Allerdings gilt auch bei diesem: Für die Klassen Number, String und Character funktioniert es, aber für anderes nicht. Arrays machen auch probleme und Listen, die müsste ich dann nochmal gesondert behandeln.


----------

