in netty, wir können nur Daten schreiben und empfangen, die weniger als 1024 Bytes haben: Wie können wir mehr schreiben oder empfangen?

8

Beim Schreiben von 2048 Bytes in den on-Handler sollte die messageRevieved-Methode zweimal aufgerufen werden, um alle Daten zu empfangen ... wie ich die 2048-Byte-Daten in

empfangen kann

Code

Server:

%Vor%

Server Handler:

%Vor%

Kunde:

%Vor%

Clienthandler:

%Vor%     
Gofier 16.04.2012, 08:05
quelle

6 Antworten

5

Nun können Sie immer entscheiden, wie viele Bytes Sie schreiben müssen, aber Sie wissen nie, wann und wie viele Bytes empfangen werden (deshalb ist NIO sinnvoll). Sie müssen mit Ihrem eigenen Puffer umgehen, um eine feste Anzahl von Bytes zu erhalten. Um dies zu tun, können Sie einen FrameDecoder verwenden, der für diesen Zweck entworfen wurde.

Außerdem können Sie sicherstellen, dass die Daten nicht zu lange im Sende-Socket-Puffer bleiben, indem Sie tcpNoDelay auf true setzen. Es wird also nicht darauf gewartet, dass der aktuelle "frame" einen bestimmten kritischen Wert erreicht Größe vor dem physischen Senden der Daten.

Wenn ich es gut verstehe, schreiben Sie 2048 Bytes in einer Hand, aber alle Daten werden nicht im messagedReceived-Ereignis empfangen? Versuchen Sie, diese häufigen Probleme zu überprüfen:

  • Ihre Bewerbung endet zu früh und die Daten sind noch nicht angekommen
  • Ihre Daten werden im Socket-Puffer des "Senders" gespeichert, weil Sie nicht geschlossen haben und die Option tcpNoDelay nicht auf "true" gesetzt wurde. Dies bewirkt, dass der Socket auf einige zusätzliche Bytes wartet, bevor er das Paket sendet.
  • Sie haben nicht alle Daten im ChannelBuffer gelesen, aber aus einem bestimmten Grund wurde der readerIndex auf eine andere Position gesetzt

Versuchen Sie, uns einen Teil Ihres Codes zu zeigen, es sollte die Dinge einfacher machen ...

HINZUGEFÜGT 17/04/2012

Wenn ich verstehe, dass Sie versuchen, eine Byte-Array-Codierung für einen String vom Sender zum Empfänger zu übergeben. Hier ist Ihr Code nach einem kleinen Refactor:

---------------------------- Code ------------------ ---------- Schreibhand: response.size () & gt; 1024bytes

%Vor%

---------------------------- Hand empfangen: sollte zweimal empfangen werden, println () würde zweimal ausgeführt werden

%Vor%

Dies ist nicht der richtige Weg, stattdessen sollten Sie direkt den StringEncoder und StringDecoder im Paket org.jboss.nety.handler.codec verwenden .string . Es wird das Framing-Problem für Sie behandeln. Wenn Sie Ihren Code weiterhin debuggen möchten, verwenden Sie den LoggingHandler von Netty. Auch hast du diese Option wirklich festgelegt:

%Vor%

in beiden Seiten Bootstraps?

    
RenaudBlue 16.04.2012 12:30
quelle
3

Versuche es mit TruncatedChannelBuffer oder BigEndianHeapChannelBuffer anstelle von channelbuffer in deinem ClientHandler . Ich denke, es wird funktionieren .. oder wenn es nicht funktioniert, bitte post Stacktrace der generierten Ausnahme. Ich habe das in meinem Code versucht und es hat funktioniert. Ich hoffe, dass dir das weiterhilft.

%Vor%     
prashant khunt 07.07.2012 08:07
quelle
2

Zunächst sollte die Bootstrap-Option für den Client nicht mit 'child' beginnen:

%Vor%

Sie verwenden auch nicht den gleichen Port auf dem Client und dem Server !!

Zweitens haben Sie keine Strategie zum "Schließen": Wann wird Ihr Kunde wissen, dass seine Arbeit erledigt ist? Wie verhinderst du, dass der Thread vorzeitig beendet wird? Sie sollten dies tun

SERVER HANDLER

%Vor%

CLIENT BOOTSTRAP

%Vor%

Schließlich müssen Sie besser verstehen, was Sie tun, indem Sie viele Beispiele lesen. Sie finden sie im Paket org.jboss.net.example im Hauptpaket-Download.

    
RenaudBlue 18.04.2012 09:53
quelle
1

Ich hatte das gleiche Problem, versuchen Sie Oio und nicht Nio! (Ändern Sie einfach "nio" zu "oio" und "Nio" zu "Oio".

Ссылка

    
Franz Bettag 15.01.2013 11:59
quelle
1

RenaudBlue @ macht gute Punkte. Außerdem schlage ich vor, zu Netty4 zu wechseln, was alle ByteBufs dynamisch macht und das Chunked Reads / Writes einfacher zu verwalten macht. Siehe "Portierung des Clients" .

Zum Beispiel

%Vor%

Netty4 hat auch die Typ-Sicherheit für die Kanaloptionskonfiguration, die den "child.tcpNoDelay" Fehler verhindert hätte.

Aber der große Gewinn für Netty4 ist das wohldefinierte Thread-Modell, das Netty viel einfacher zu verwenden macht.

    
cdunn2001 31.03.2013 17:35
quelle
0

Sie müssen FixedRecvByteBufAllocator von SocketChannel in childHandler() wie folgt einrichten:

%Vor%     
thangdc94 04.01.2018 07:37
quelle

Tags und Links