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:
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?
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.
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.
Ich hatte das gleiche Problem, versuchen Sie Oio und nicht Nio! (Ändern Sie einfach "nio" zu "oio" und "Nio" zu "Oio".
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.
Tags und Links netty