2016-05-23 8 views
-1

Ich fing gerade an, auf Netty 4 zu kodieren und fand, dass es scheint, nur einzelnes Trennzeichen zu stützen, obwohl es behauptet, mehrere Trennzeichen zu stützen. Tatsache ist, dass es die Verwendung mehrerer Trennzeichen anstelle von gleichzeitig unterstützt.Wie fügt man Kopf und Schwanz Delimiter Frame Decoder in Netty 4?

Der Grund, warum ich sowohl Kopf- als auch Endbegrenzer brauche, ist der Geschwindigkeit zuliebe, wenn es Fälle von Paketverlust oder Out-of-Order-Paketen gibt. Zum Beispiel Meine Frames sehen so aus: $ _ {LEN} {DATA}

Also ist der Kopfbegrenzer für mich $ _, während der letzte ist \ r \ n.

Angenommen, es werden mehrere Pakete in einem Frame empfangen, während einige der Zwischenpakete während der Übertragung verloren gehen, wenn ohne $ der Decoder weiter nach \ r \ n suchen muss, um das Ende zu bestimmen. Was ist, wenn \ r \ n auch verloren ist, dann muss es nach dem nächsten \ r \ n suchen, anstatt das $ zu treffen, das eine neue Nachricht ...

führt, aber es scheint, dass netty DelimiterBasedFrameDecoder was nicht unterstützen konnte Ich will oben. Wie soll ich mein eigenes für diesen Zweck implementieren?

Es sieht für mich Netty FrameDecoder Design berücksichtigt Paketverlust oder Packer nicht aus der Bestellung Fälle? Ich könnte mich damit bei Netty geirrt haben. Bitte, bitte, wenn es jemanden gibt, der mir Licht geben kann.

+0

Verwenden Sie UDP- oder Tcp-Streams? Bei UDP-Streams werden die empfangenen Bytes normalerweise nicht erneut gesendet. – Ferrybig

+0

TCP-Streams: Der Server wird in einem Cloud-Rechenzentrum ausgeführt, die Client-Geräte sind entweder über WiFi LAN oder 3G/2G SIM Mobile Wireless WAN verbunden. Daher kann das Netzwerk instabil und anfällig für Netzwerkinterferenzen sein, die normalerweise Paketverluste verursachen ... –

+0

Beachten Sie, dass tcp entweder die Daten so wie sie sind (also keine Änderungen) oder einen Verbindungsfehler garantiert. Dies bedeutet, dass kein Teil des Pakets verloren gehen sollte. – Ferrybig

Antwort

1

Ich endete mit netty's LengthFieldBasedFrameDecoder für die Kürze und Effizienz, die sowohl für die Client-und Server-Seite Paketrahmen Decodierung von Bedeutung ist. Meine Nachrichten sind von diesem Format: \ r \ n $ LEN $ DATA \ r \ n $ LEN $ DATA

ChannelPipeline p = ch.pipeline(); 
p.addLast(new LengthFieldBasedFrameDecoder(1024,2,4,0,6)); 

Abhängig von der Client-Umgebung kann Netty Bibliothek oder nicht in Client-Verbindung und Kommunikation verwendet werden. Mit dieser Nachrichtenstruktur kann jedoch immer leicht ein relativ robuster und effizienter Rahmendecodierungscode geschrieben werden.

+0

'LengthFieldBasedFrameDecoder' ist die richtige Wahl – user5698801

0

Ich denke, der DelimiterFrameDecoder nimmt einen verlustfrei geordneten Eingabestrom an. Wenn Ihre Transportschicht der unteren Ebene in Ihrer Pipeline keine verlustfreie geordnete Verbindung ist, müssen Sie einen eigenen Rahmendecoder implementieren, der verlorene Daten und Frames außerhalb der Reihenfolge verarbeitet, indem Prüfsummen und Frame-IDs oder eine andere Protokollstrategie implementiert werden.

+0

In einer verrauschten drahtlosen Netzwerkumgebung kann Paketverlust oder Out-of-Order ziemlich häufig auftreten. Aber ich denke, DelimiterFrameDecoder oder andere Delimiter-Frame-Decoder, die in Netty bereitgestellt werden, unterstützen die Wiederherstellung (ich meine die Fähigkeit, schließlich die richtigen Startpakete zu finden) aus einem Strom von eingehenden Bytes gemischt mit beschädigten oder fehlenden Bytes.Der Hauptunterschied zwischen diesen Decodern zu mir ist die Effizienz zu tun: 1) Geschwindigkeit beim Lokalisieren der neuen guten Startpakete; 2) verschwenden weniger Bytes beim Erhalten des guten Pakets; Aber ich habe einen einfacheren Weg mit LengthFieldBasedFrameDecoder gefunden. –

+0

Außerdem, für Paket Korruption oder Verlust, implementiert ich App-Level-Logik, um die garantierte Nachrichtenübermittlung, indem Sie auf ACK-Nachricht von der Empfängerseite. Natürlich muss die Nachricht zuerst zwischengespeichert werden, bevor ACK empfangen wird, und sie wird gelöscht, nachdem ACK vom Empfänger empfangen wurde. –

Verwandte Themen