2013-10-10 8 views
15

Как получить массив байтов от ByteBuf эффективно в коде ниже? Мне нужно получить массив, а затем сериализовать его.Netty java получение данных от 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

Можете ли вы опубликовать полный код. Также укажите, какую версию netty вы используете? –

+0

Я использую 4.0.9 версию Netty – NiceTheo

+0

Итак, в чем проблема? Что вы подразумеваете под массивными байтами в приведенном выше контексте? –

ответ

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

Если вы не хотите readerIndex изменения:

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

Если вы хотите, чтобы минимизировать копию памяти, вы можете использовать подкладочный массив из ByteBuf, если он доступен :

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; 
} 

Пожалуйста, обратите внимание, что вы не можете просто использовать buf.array(), потому что:

  • Не все ByteBuf s имеют опорный массив. Некоторые из них являются буферами вне кучи (т.е. прямой памятью)
  • Даже если a ByteBuf имеет базовый массив (то есть buf.hasArray() возвращает true), следующее необязательно верно, поскольку буфер может быть срезом другого буфера или объединенного буфера :
    • buf.array()[0] == buf.getByte(0)
    • buf.array().length == buf.capacity()
+1

[@ user6 хотел бы знать] (http://stackoverflow.com/a/28122795/2778484), если он может сделать 'byte [] ar = buf.array () '(если я правильно понимаю сообщение). – chappjc

+0

Обновлен ответ для него. – trustin

Смежные вопросы