tut protobuf brauchen ein Netzwerk-Paket-header?
Ich bin mit 'protobuf' für C/S-Netzwerk-Programm mit TCP.
hier mal meine Schritte für den client:
1, pack die Daten in ein 'protobuf'
2, bekommen Größe in bytes des Packs und bauen eine Länge-prefix Rahmen
3, schreiben Sie den Rahmen+pack, socket
und dann den server:
1, lese-Länge-prefix Rahmen von sockel und die Länge N
2, read N bytes vom socket und füllen Sie die Daten in protobuf-Instanz
3, get", Wert,"s" protobuf "Schlüssel"s
scheint es ein wenig kompliziert, denke ich, ist es eine Art von automatisch generierten Länge-prefix Rahmen für protobuf, dann brauche ich nicht das Konstrukt selber. oder etwas anderes, das ich tun kann, um code-Reiniger?
- Deine Frage ist mehrdeutig / unklar. Verwenden Sie TCP? UDP? IP? oder eine andere Netzwerk-Protokoll? Es ist schwer zu sagen, was protobuf ist. Ist es eine Struktur oder einfach nur eine Daten-blob? Die meisten C/S-Anwendungen benötigen etwas Hilfe herauszufinden, die Vernunft der Daten gesendet oder empfangen werden. Sie müssen um genauer zu sein und zeigen Sie code.
- vielen Dank für Ihren Vorschlag, ich werde es machen mehr klar. 'protobuf" bezieht sich insbesondere auf eine google-opensource-Projekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit protobuf, und vorausgesetzt, Sie senden mehrere Nachrichten auf den gleichen Leitung, dann: ja, Sie müssen haben eine Länge, die als Präfix, sonst wird es Lesen wollen, um das Ende des Streams.
protobuf beinhaltet einige grundlegende RPC stubs, aber der RPC-Implementierung, die Sie verwenden, ist nicht Teil der OSS-Projekt, das ist also nicht verfügbar. Es gibt einige standalone-protobuf RPC-stacks aufgeführt in den Implementierungen obwohl.
Persönlich, ich Neige dazu, zu behaupten, dass die Sequenz von Daten ist Teil eines
repeated
Sequenz - d.h. Präfix mit "Feld 1 string" (aka0a
), und die Länge wie "varint" codiert. Dies bedeutet, dass das gesamte Netzwerk zu streamen, ist eine gültige protobuf-stream. Das ist vielleicht nur meine OCD treten, aber.Einige Implementierungen haben können Funktionen enthalten, um Hilfe mit diesem. protobuf-net (einem der .NET-Versionen) hat
SerializeWithLengthPrefix
/DeserializeWithLengthPrefix
Methoden, zum Beispiel, die es erlaubt, die Bibliothek für Euch tun (während mit einer Vielzahl von Formaten für Ihre Wahl).Ich weiß nicht, ob dies angemessen ist für deine Aufgabe, aber ich würde in einem der 'rpc-Implementierungen" schon geschrieben, für die Sprache(N), die Sie unterstützen möchten.
https://github.com/protocolbuffers/protobuf/blob/master/docs/third_party.md#rpc-implementations
z.B. habe ich gute Ergebnisse, die in Java mit Netty ' s eingebaute Unterstützung für das senden von
MessageLite
Instanzen eines bestimmten Typs: http://docs.jboss.org/netty/3.2/guide/html/architecture.html#d0e1979(Ich bin sicher, dass Ihre Länge header wird die Arbeit machen, OK, aber frameworks wie Netty werden die Unterstützung für Dinge wie asynchron 'duplex' IO, SSL, Authentifizierung, etc, mit relativer Leichtigkeit)
HTH