2013-10-10 5 views
15

Wie erhalten Sie eine Byte-Array von ByteBuf effizient in den folgenden Code? Ich muss das Array bekommen und es dann serialisieren.Netty Java Daten von ByteBuf

package testingNetty; 
import io.netty.buffer.ByteBuf; 
import io.netty.channel.ChannelHandlerContext; 
import io.netty.channel.ChannelInboundHandlerAdapter; 

public class ServerHandler extends ChannelInboundHandlerAdapter { 
    @Override 
     public void channelRead(ChannelHandlerContext ctx, Object msg) { 
     System.out.println("Message receive"); 
     ByteBuf buff = (ByteBuf) msg; 
      // There is I need get bytes from buff and make serialization 
     byte[] bytes = BuffConvertor.GetBytes(buff); 
     } 

     @Override 
     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { 
      // Close the connection when an exception is raised. 
      cause.printStackTrace(); 
      ctx.close(); 
     } 

} 
+0

können Sie bitte den vollständigen Code schreiben. Erwähnen Sie auch, welche Version von Netty Sie verwenden? –

+0

Ich benutze 4.0.9 Version von Netty – NiceTheo

+0

Also was ist das Problem? Was meinst du mit Bytes massiv im obigen Kontext? –

Antwort

47
ByteBuf buf = ... 
byte[] bytes = new byte[buf.readableBytes()]; 
buf.readBytes(bytes); 

Wenn Sie nicht wollen, die readerIndex ändern:

ByteBuf buf = ... 
byte[] bytes = new byte[buf.readableBytes()]; 
int readerIndex = buf.readerIndex(); 
buf.getBytes(readerIndex, bytes); 

Wenn Sie die Speicherkopie minimieren möchten, können Sie die Unterstützung Array des ByteBuf verwenden, wenn es verfügbar ist :

ByteBuf buf = ... 
byte[] bytes; 
int offset; 
int length = buf.readableBytes(); 

if (buf.hasArray()) { 
    bytes = buf.array(); 
    offset = buf.arrayOffset(); 
} else { 
    bytes = new byte[length]; 
    buf.getBytes(buf.readerIndex(), bytes); 
    offset = 0; 
} 

Bitte beachten Sie, dass Sie nicht einfach buf.array() verwenden können, denn:

  • Nicht alle ByteBuf s haben Backing Array. Einige sind Off-Heap-Puffer (dh Direktspeicher)
  • Auch wenn ein ByteBuf eine Backing-Array hat (dh buf.hasArray() gibt true zurück), ist das folgende nicht unbedingt wahr, da der Puffer ein Stück eines anderen Puffers oder eines gepoolten Puffers sein könnte :
    • buf.array()[0] == buf.getByte(0)
    • buf.array().length == buf.capacity()
+1

[@ user6 möchte wissen] (http://Stackoverflow.com/a/28122795/2778484), wenn er tun kann, byte [] ar = buf.array () '(wenn ich den Beitrag richtig verstehe). – chappjc

+0

Die Antwort für ihn aktualisiert. – trustin