29 Mayıs 2018 Salı

Netty Buffer

ByteBuf Sınıfı
Byte'ları taşıyan sınıf. Eski kodlardaki ChannelBuffer bu sınıf ile değiştirilebilir. writeX() metodları ile yazılır, readX() metodları ile okunur.

constructor
Örnek
Şöyle yaparız.
final ByteBuf buf = ByteBufAllocator.DEFAULT.ioBuffer(8192);
Örnek
Şöyle yaparız.
ChannelHandlerContext ctx = ...;

ByteBuf syncBuf = ctx.alloc().buffer(100);
release metodu
ByteBuf nesnesi reference counting işlemine tabi. Eğer bir nesne düzgünce silinmezse Netty az sayıda hata mesajı basıyor. Açıklaması şöyle.
Netty adds a hook to the ByteBuf code such that when a GC occurs, it checks whether this buffer was released(), if it doesn’t it prints the error message above. ONE important detail here is that it only does this check for a fraction of the byte buffers (sampling), thus when you see this error message only once, it probably means it happens a lot more than once.
retain metodu
Reference count değerini artırmak içindir. Şöyle yaparız.
@Override
public void channelRead(final ChannelHandlerContext ctx, final Object msg)
throws Exception {
  final ByteBuf buff = (ByteBuf) msg;
  try {
    if (clientSocketChannel != null){
      clientSocketChannel.writeAndFlush(buff.retain()).sync();    
    }
  } finally {
    buff.release();
  }
}
setByte metodu
Şöyle yaparız.
ByteBuf mbuf = ctx.alloc().buffer();
mbuf.setByte(0, 69);
mbuf.setByte(1, 70);
mbuf.setByte(2, 71);
ctx.writeAndFlush(mbuf);
toString metodu
Örnek
Şöyle yaparız.
ByteBuf in = ...;
String str = in.toString(io.netty.util.CharsetUtil.UTF_8); 
Örnek
Şöyle yaparız.
ByteBuf in = ...;
String str = in.toString(CharsetUtil.ISO_8859_1);
writeByte metodu
Şöyle yaparız.
buf.writeByte((byte)70);
writeBytes metodu
Şöyle yaparız.
ByteBuf buf = Unpooled.buffer(1024);
buf.writeBytes("hello".getBytes(StandardCharsets.UTF_8));
writeInt metodu
Şöyle yaparız.
buf.writeInt(70);
writeLong metodu
Şöyle yaparız.
ByteBuf hex = Unpooled.buffer(8).order(ByteOrder.LITTLE_ENDIAN);
hex.writeLong(Double.doubleToLongBits(1504642224.94664));
System.out.println(ByteBufUtil.prettyHexDump(hex));
writeShort metodu
Şöyle yaparız.
buf.writeShort((short)70);
CompositeByteBuf Sınıfı
Giriş
Eklenen ByteBuf nesneleri için view yaratır.
constructor
Örnek
Şöyle yaparız.
ChannelHandlerContext ctx = ...
CompositeByteBuf accumulator = ctx.alloc().compositeBuffer(Integer.MAX_VALUE);
Örnek
Şöyle yaparız.
CompositeByteBuf composite = Unpooled.compositeBuffer();
addComponent metodu - ByteBuf
Eğer ByteBuf okunacaksa ilk parametre true olmalıdır. Şöyle yaparız.
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
  ByteBuf ioBuffer = (ByteBuf) msg;
  accumulator.addComponent(true, ioBuffer);
}
addComponent metodu - ByteBuf + ByteBuf + ByteBuf
Göndermek için şöyle yaparız
CompositeByteBuf messageBuf = Unpooled.compositeBuffer();
ByteBuf syncBuf = ...;

ByteBuf headerBuf = ...;

ByteBuf bodyBuf = ...;

messageBuf.addComponents(syncBuf, headerBuf, bodyBuf);
numComponents metodu
Şöyle yaparız.
System.out.println("Number of components " + composite.numComponents() +
                   ", Composite readable bytes: " + composite.readableBytes()); 
release metodu
Şöyle yaparız.
@Override
public void channelInactive(ChannelHandlerContext ctx) {
 ...
  accumulator.release();
  ...
}
PooledByteBufAllocator Sınıfı
Giriş
Şu satırı dahil ederiz. Bu sınıf bellleği tekrar kullanabilme imkanı sağlar.
import io.netty.buffer.PooledByteBufAllocator;
DEFAULT Alanı
Şöyle yaparız.
Bootstrap bootstrap = new Bootstrap();
bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
Unpooled Sınıfı
Giriş
Bu sınıf sadece static metodlardan oluşuyor. Aslında ismi UnpooledUtils olsaydı daha iyi olurdu.
buffer metodu
Yeni ve boş bir nesne döner. Şöyle yaparız.
ByteBuf buf1 = Unpooled.buffer(1024);
compositeBuffer metodu
Şöyle yaparız.
CompositeByteBuf composite = Unpooled.compositeBuffer();
copiedBuffer metodu - ByteBuf
Verilen parametre için deep copy işlemi yapar.
Örnek
Şöyle yaparız.
final String str= "...";
ByteBuf buf = Unpooled.copiedBuffer(str, StandardCharsets.UTF_8).asReadOnly();
Örnek
Şöyle yaparız.
ChannelFuture cf =ctx.channel().writeAndFlush(Unpooled.copiedBuffer(...));
EMPTY_BUFFER Alanı
Şöyle yaparız.
this.ctx.writeAndFlush(Unpooled.EMPTY_BUFFER);
wrappedBuffer metodu
Verilen parametre için shallow copy işlemi yapar. Örnek ver

UnpooledByteBufAllocator Sınıfı
AbstractByteBufAllocator sınıfından kalıtır.

Örnek ver

Hiç yorum yok:

Yorum Gönder