benötigt protobuf einen Netzwerkpaketkopf?

8

Ich verwende " protobuf " für ein C / S-Netzwerkprogramm, das TCP verwendet.

Hier sind meine Schritte für den Kunden:

1, packen Sie Daten in einen 'Protobuf'

2, erhalte die Größe in Bytes des Pakets und konstruiere einen Längenpräfixrahmen

3, schreibe Frame + Pack in Socket

und dann der Server:

1, lese Length-prefix frame vom Socket und bekomme die Länge N

2, lese N Bytes vom Socket und fülle die Daten in die protobuf-Instanz

3, erhalten Sie "Wert" s von Protobuf durch "Schlüssel" s

es scheint ein wenig kompliziert, denke ich, gibt es eine Art von automatisch generierten Länge Präfix Rahmen für Protobuf, dann brauche ich nicht konstruieren eins von mir. oder irgendetwas anderes, was ich tun kann, um den Code sauberer zu machen?

    
Shawn 15.11.2011, 07:04
quelle

2 Antworten

5

Mit Protobuf, und vorausgesetzt, Sie senden mehrere Nachrichten in der gleichen Pipe, dann: ja - Sie müssen eine Länge als Präfix haben, sonst wird es bis zum Ende des Streams lesen wollen.

protobuf enthält einige grundlegende RPC Stubs , aber die RPC-Implementierung, die sie verwenden, ist nicht Teil des OSS-Projekts und ist daher nicht verfügbar. Es gibt jedoch einige eigenständige Protobuf-RPC-Stacks , die in den Implementierungen aufgeführt sind .

Persönlich tendiere ich dazu, so zu tun, als sei die Sequenz von Daten Teil einer repeated Sequenz - d. h. Präfix mit "Feld 1, Zeichenkette" (aka 0a ) und die Länge als "varint" kodiert. Dies bedeutet, dass der gesamte Netzwerkstream ein gültiger Protobuf-Stream ist. Das könnte aber nur mein OCD sein.

Einige Implementierungen verfügen möglicherweise über Funktionen, die dabei helfen. protobuf-net (eine der .NET-Versionen) hat zum Beispiel die SerializeWithLengthPrefix / DeserializeWithLengthPrefix -Methode, mit der die Bibliothek dies für Sie tun kann (und dabei eine Reihe von Formaten zur Auswahl anbietet).

    
Marc Gravell 15.11.2011, 20:23
quelle
3

Ich weiß nicht, ob dies für Ihre Aufgabe geeignet ist, aber ich würde mir eine der 'RPC-Implementierungen' ansehen, die bereits für die Sprache (n) geschrieben wurden, die Sie unterstützen möchten.

Ссылка

z.B. Ich hatte gute Ergebnisse in Java mit Nettys eingebauter Unterstützung für das Senden von MessageLite Instanzen eines bestimmten Typs: Ссылка

(Ich bin mir sicher, dass Ihr Längenheader den Job OK macht, aber Frameworks wie Netty werden die Unterstützung für Dinge wie asynchrone 'Duplex'-IO, SSL, Authentifizierung usw. relativ einfach hinzufügen)

HTH

    
laher 15.11.2011 07:13
quelle