2017-06-15 3 views
1

Ich erweitere ChannelInboundHandlerAdapter und möchte die genaue Anzahl der Bytes lesen.Netty genaue Anzahl der Bytes lesen

public class Reader extends ChannelInboundHandlerAdapter{ 

    @Override 
    public void channelRead(ChannelHandlerContext ctx, Object msg){ 
     ByteBuf b = (ByteBuf) msg; 
     byte size = b.readByte(); 
     //Now I want to read exactly size bytes from the channel 
     //and then again read the number of bytes and read the bytes... 
    } 

} 

Das Problem ist, es kann vorkommen, dass wir von ByteBuf weniger als erforderlich Bytes lesen. Wie lese ich mehr aus der Channel?

Antwort

1

Nur zum Lesen können Sie b.readSlice(size) verwenden. Wie Sie bereits erwähnt haben der Puffer möglicherweise noch nicht genügend Daten für Ihre Nachricht. Sie müssen also Daten vollständig verbrauchen, bevor Sie die Nachricht erstellen. Für diesen Fall würde ich Ihnen empfehlen, den integrierten Handler ByteToMessageDecoder zu verwenden. Es behandelt Low-Level-Bytes für Sie. Also mit ByteToMessageDecoder Ihr Code wie folgt aussehen:

class Reader extends ByteToMessageDecoder { 
    @Override 
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { 
     byte size = in.readByte(); 
     if (in.readableBytes() < size) { 
      in.resetReaderIndex(); 
      return; 
     } 

     ByteBuf bb = in.readSlice(size); 
     //make whatever you want with bb 
     Message message = ...; 
     out.add(message); 
    } 
} 

So in diesem Beispiel lesen Sie die Anzahl der Bytes, die Sie für die Nachricht lesen müssen - size. Dann überprüfen Sie, ob Ihr in Puffer genügend Daten zum Verbrauch hat. Wenn nicht - geben Sie die Kontrolle an ByteToMessageDecoder zurück, bis es mehr gelesen hat. Und wiederholen Sie, bis Sie genug Daten haben, um Ihre Nachricht zu erstellen.

+0

Eigentlich ja. Danke vielmals. Aber was ist mit den Unterschieden zwischen "ReplayingDecoder"? Wann benutzt man welchen? –

+1

@ St.Antario bitte schauen Sie sich 'ReplayingDecoder' javadocs an. Es hat eine sehr gute Erklärung mit Beispielen. Kurz gesagt - 'ReplayingDecoder' macht mehr und Sie müssen' in.readableBytes()

+0

ReplayingDecoder kann Ihnen helfen, komplexe Situationen zugrunde liegender Datenströme, z. Daten sind nicht genug. Wenn Ihnen die Leistung nicht allzu wichtig ist, wird Ihr Code-Logik-Komplex zu sehr reduziert. – Kaneg

Verwandte Themen