Die Leute schreiben ihre eigenen Encoder/Decoder (Codecs), weil Netty kein Anwendungsprotokoll vorschreibt oder definiert, so dass es Ihnen freisteht, Ihr eigenes Protokoll zu schreiben. Der Satz von Codecs, den Sie definieren, ist ein Protokoll, das alles zwischen String-basierten und einigen binären Formaten wie Protobuf sein kann. Netty stellt Codecs für Ihre Bequemlichkeit zur Verfügung (die, die Sie verwendeten, sind Beispiele).
Ich würde davon ausgehen, das aus dem Strom zu halten, ist eine frühzeitige Abschaltung zu sein?
Normalerweise, wenn Sie Senden/Empfangen von Streams, müssen Sie das auf einem festen Länge Chunks (Frames genannt) zersetzen. Ein beliebter Ansatz, der seit dem Beginn des Internets verwendet wird, besteht darin, die Länge des Chunks (normalerweise ein 4-Byte-Int) als das erste aus dem Stream gelesene Feld zu verwenden. Wenn also der Wert des ersten int 20 ist, wissen Sie, dass die folgenden 20 Bytes die Nutzdaten (die Daten) und das 21. Byte das erste Byte einer anderen Länge sind. Der Vorteil dieses Ansatzes besteht darin, dass er Stücke variabler Länge zulässt. Aber Sie sind nicht darauf beschränkt. Wenn Sie beispielsweise planen, ein Protokoll zu schreiben, das Strings mit vordefinierter Länge (mit Auffüllung) verwendet, schreiben Sie oder verwenden Sie besser noch netty die aktuellen Codecs.
Einmal implementiert I ein Protokoll mit drei Decodern, die in dieser Reihenfolge durchführen würden:
- einen Strom empfangen und zersetzen es in der Länge als Präfix Rahmen;
- wandeln Sie jeden Rahmen in eine Zeichenfolge um;
- Verwenden Sie Jackson Libray, um eine Zeichenfolge in ein vordefiniertes Java-Objekt zu konvertieren.
Die Encoder würden nur die gleichen Operationen ausführen, aber rückwärts. Leider habe ich den ursprünglichen Code verloren, aber ich werde ihn bald umschreiben.
Aber woher weiß der Strom, dass der Strom ein String oder eine Reihe von int ist oder eine Reihe von Doppel ist? Wie sagst du es, ist der Unterschied die Frage?
Kurze Antwort: es nicht weiß. Sie müssen diese Informationen in den Codecs verschlüsseln. Beispielsweise können Sie einen Opcode als erstes Feld in der Payload verwenden, das besagt, dass Payload Strings, Double, Ints oder eine Kombination aus beidem ist.
Grundsätzlich bietet Netty einen Stream und Sie können frei dekodieren, wie Sie möchten. Wenn Sie beispielsweise eine Reihe von Longs (8 Bytes) lesen, schreiben Sie einen Codec, der 64 Bytes gleichzeitig aus dem Stream liest, weil jeder einzelne einen Long repräsentiert. Netty bietet Codecs out-of-box, so dass Sie das Rad nicht jedes Mal neu erfinden müssen.
Ich möchte hinzufügen, dass ich auf die netty API referenziere und wie es Decoder und Encoder wirklich verwendet ... Ich fühle mich, als ob der Führer nicht wirklich ins Detail geht über die Implementierung Ihrer eigenen Decoder und wie .. Ich möchte auch wiederholen, wie ich es das letzte Mal gesagt habe. Ich habe meinen Kopf eine Weile auf diesen Kopf geschlagen, und ich kann es einfach nicht begreifen ... – Maxs728