Protokoll

T

Tomate_Salat

Gast
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
 
T

Tomate_Salat

Gast
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 :D
 

ice-breaker

Top Contributor
Google Protobuf?

Oder eben ein eigenes binäres Protokoll:
Code:
---------------------------------------------------------
| 4 Byte Länge | 1 Byte Object Id | ... object data ... |
---------------------------------------------------------

womit ich dein Protokoll bei den meisten Eingaben toppe:
Java:
class ABC {
  public String foo = "Foo Bar";
  public int num = 12;
}
Code:
--------------------------------------------------------------------------------------------------------
| 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
 
Zuletzt bearbeitet:

Wildcard

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

Tomate_Salat

Gast
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.
 

ice-breaker

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

Tomate_Salat

Gast
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^^.
 
T

Tomate_Salat

Gast
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

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

Tomate_Salat

Gast
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:

Code:
[{1|5}1hallo]
selbes prinzip wie oben, nur die indexzahlen werden besser hervorgehoben + [] markieren jz ein Objekt, somit ist auch soetwas möglich:
Code:
[{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.
 

Ähnliche Java Themen


Oben