tutorial tuning examples java netty

java - tuning - netty tutorial



Netty java obteniendo datos de ByteBuf (1)

¿Cómo obtener una matriz de bytes de ByteBuf de ByteBuf eficiente en el siguiente código? Necesito obtener la matriz y luego serializarla.

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


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

Si no desea que el readerIndex cambie:

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

Si desea minimizar la copia de memoria, puede usar la matriz de respaldo de ByteBuf , si está disponible:

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

Tenga en cuenta que no puede simplemente usar buf.array() , porque:

  • No todos los ByteBuf s tienen matriz de respaldo. Algunos son buffers fuera de pila (es decir, memoria directa)
  • Incluso si un ByteBuf tiene una matriz de respaldo (es decir, buf.hasArray() devuelve true ), lo siguiente no es necesariamente cierto porque el búfer puede ser una porción de otro búfer o un búfer agrupado:
    • buf.array()[0] == buf.getByte(0)
    • buf.array().length == buf.capacity()