10 Mayıs 2018 Perşembe

Netty

Maven
Şu satırı dahil ederiz.
<dependency>
  <groupId>io.netty</groupId>
  <artifactId>netty-all</artifactId>
  <version>4.1.20.Final</version>
</dependency>
Bootstrap Sınıfı
Bootstrap Sınıfı yazısına taşıdım.

ByteBuf Sınıfı
Netty Buffer yazısına taşıdım.

ByteToMessageDecoder Sınıfı
Netty Decoders yazısına  taşıdım.

Channel Arayüzü
Netty Channels yazısına taşıdım.

ChannelFuture Sınıfı
Netty Channels yazısına taşıdım.

ChannelHandlerContext Sınıfı
Giriş
Açıklaması şöyle.
ChannelHandlerContext is useful when you want to modify the pipeline dynamically, fire events up and down the pipeline etc. If you don't need these, you can just use Channel
channel metodu
Örnek
Şöyle yaparız
Channel channel = ctx.channel();
writeAndFlush metodu
Bu çağrı ile Channel.writeAndFlush() farklıdır. Bu çağrı tüm pipeline'ı dolaşmayabilir. ChannelHandler'dan önceki encoder'ları dolaşır.

Asenkron bir çağrıdır. ChannelFuture nesnesi döner.
Örnek
Şöyle yaparız.
ChannelHandlerContext ctx = ...;

String str = "...";
ChannelFuture channelFuture = ctx.writeAndFlush(str);

channelFuture.addListener(future -> {
  if (future.isSuccess()) {...}
  else {...}
  ctx.close();
});
Örnek
Çağrı bitince bir işlem daha yapmak için şöyle yaparız.
ctx.writeAndFlush("...")
  .addListener(ChannelFutureListener.CLOSE);
ChannelInboundHandlerAdapter Sınıfı
Netty ChannelInboundHandlers yazısına taşıdım.

ChannelInitializer Sınıfı
Giriş
Açıklaması şöyle.
The ChannelInitializer is a special handler that is purposed to help a user configure a new Channel. It is most likely that you want to configure the ChannelPipeline of the new Channel by adding some handlers such as ... to implement your network application. 
initChannel metodu
Örnek
Sunucu tarafında şöyle yaparız. Eğer ServerBootstrap sınıfının channel() metoduna NioServerSocketChannel tipi geçersek ChannelInitializer'ın tipi SocketChannel olur.
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
 .channel(NioServerSocketChannel.class)
 .childHandler(new ChannelInitializer<SocketChannel>() {
   @Override
   public void initChannel(SocketChannel ch) {
     ch.pipeline().addLast(new IdleStateHandler(45,0,0));
     ch.pipeline().addLast(new MyByteToMessageDecoder());
     ch.pipeline().addLast(new MyHandler());
   }
});
Örnek
Eğer istesek sunucu tarafında ayrı bir sınıf olarak kullanılabilir. Şöyle yaparız.
public class MyInitializer extends ChannelInitializer<SocketChannel> 
{
  @Override
  public void initChannel(SocketChannel ch) throws Exception {
    ChannelPipeline pipeline = ch.pipeline();
    ...
  }
}
Örnek
Veriyi satırlara ayırarak benim sınıfımı çağıran kod için şöyle yaparız.
private static final StringDecoder DECODER = new StringDecoder();
@Override
protected void initChannel(SocketChannel ch) throws Exception {
  ChannelPipeline pipeline = ch.pipeline();
  pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
  pipeline.addLast(DECODER);
  pipeline.addLast(new MySentenceReaderHandler()); 
}
ChannelPipeline Arayüzü
ChainHandler'ları yönetir. Genel kural olaral önce decoder, sonra encoder ve en son olarak handler'lar eklenir. Şöyle yaparız
 ch.pipeline().addLast(
    new RequestDecoder(), 
    new ResponseDataEncoder(), 
    new ProcessingHandler());
Decoder ve handler şöyledir. Burada Netty 5 sınıfları kullanılıyor.
ChannelHandler -> ChannelHandlerAdapter -> MessageToMessageDecoder -> FooDecoder
ChannelHandler -> ChannelHandlerAdapter -> SimpleChannelInboundHandler -> FooHandler
addAfter metodu
Örnek ver

addBefore metodu
Örnek ver

addFirst metodu
Örnek ver

addLast metodu -  EventExecutorGroup +  name + ChannelHandler
Şöyle yaparız.
static final EventExecutorGroup group = new DefaultEventExecutorGroup(16);
 ...

ChannelPipeline pipeline = ch.pipeline();

pipeline.addLast("decoder", new MyProtocolDecoder());
pipeline.addLast("encoder", new MyProtocolEncoder());

// Tell the pipeline to run MyBusinessLogicHandler's event handler methods
// in a different thread than an I/O thread so that the I/O thread is not blocked by
// a time-consuming task.
// If your business logic is fully asynchronous or finished very quickly, you don't
// need to specify a group.
pipeline.addLast(group, "handler", new MyBusinessLogicHandler());

ChannelPromise Sınıfı
addListener metodu
Şöyle yaparız.
ChannelPromise promise = c.newPromise();
promise.addListener(new ChannelFutureListener() {
  @Override
  public void operationComplete(ChannelFuture f) {
    System.err.println("<TCPIn: promise write operationComplete.");
    if (!f.isSuccess()) {
      System.err.println("<TCPIn[writting]: promise write ERROR:");
      f.cause().printStackTrace();
      f.channel().close();
    }
  }
});
channel.writeAndFlush(buf,promise);
ChunkedFile Sınıfı
Giriş
Açıklaması şöyle.
You almost never need to close the ChunkedInput yourself, since you will normally have a ChunkedWriteHandler in the pipeline which will close it for you after the last chunk is written.
ChunkedInput arayüzünden kalıtır.
constructor - File
Şöyle yaparız.
ctx.writeAndFlush(new ChunkedFile(new File(...));
constructor - RandomAccessFile + offset + length+ chunkSize
Şöyle yaparız.
ctx.writeAndFlush(new HttpChunkedInput(new ChunkedFile(raf, 0, fileLength, 8192)),
  ctx.newProgressivePromise());
DefaultChannelGroup Sınıfı
Giriş
Bir sunucundaki açık tüm channel nesnelerini saklamak için kullanılabilir.
constructor
Şöyle yaparız.
static final ChannelGroup channels =
  new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
add metodu
Gruba yeni bir channel ekler.

close metodu
Gruptaki tüm channel nesnelerini kapatır.

write metodu
Açıklaması şöyle
Writes the specified message to all Channels in this group. If the specified message is an instance of ByteBuf, it is automatically duplicated to avoid a race condition. The same is true for ByteBufHolder. Please note that this operation is asynchronous as Channel.write(Object) is.
Şöyle yaparız.
Object msg = ...;
channelGroup.write(msg);


DefaultEventExecutorGroup Sınıfı
Netty EventExecutorGroup yazısına taşıdım.

EventLoopGroup Arayüzü
Netty EventLoopGroup yazısına taşıdım.

NioEventLoopGroup Sınıfı
Netty EventLoopGroup yazısına taşıdım.

OioEventLoopGroup Sınıfı
Netty EventLoopGroup yazısına taşıdım.

PooledByteBufAllocator Sınıfı
Netty Buffer yazısına taşıdım.

ServerBootstrap Sınıfı
Netty ServerBootstrap Sınıfı yazısına taşıdım.

SimpleChannelInboundHandler Sınıfı
Netty ChannelInboundHandlers yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder