Netty SimpleChannelInboundHandlerクラス継承使用

1729 ワード

SimpleChannelInboundHandlerを継承してClientを実装し、3つの方法を書き換える必要があります.
package NettyDemo.echo.handler;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.util.CharsetUtil;
@Sharable
public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {  
    /**   
    *                
    * */  
    public void channelActive(ChannelHandlerContext ctx) {    
        ctx.write(Unpooled.copiedBuffer("Netty rocks!", CharsetUtil.UTF_8));  
    }  
    /**   
    *                 
   * */  
   public void channelRead0(ChannelHandlerContext ctx, ByteBuf in) {    
       System.out.println("Client received: " + ByteBufUtil.hexDump(
       in.readBytes(in.readableBytes())));  
    }
   /**   
   *      
   * */  
   public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {    
       cause.printStackTrace();    
       ctx.close();  
   }

}

ここで注意しなければならないのはchannelRead 0()メソッドであり、このメソッドが受信したのは、サーバが5バイトのデータを送信したなど、いくつかのデータ断片である可能性があります.Client側は、最初に3バイト、2回目に2バイトを受信したなど、一度にすべての受信を保証することはできません.また、TCPプロトコルに基づくバイトストリームなど、具体的にどのプロトコルが順序を保証できるかによって、これらのフラグメントを受信する順序が一致するかどうかにも関心を持つかもしれません.
もう一つ、Client側で私たちの業務Handlerが継承しているのはSimpleChannelInboundHandlerで、サーバー側で継承しているのはChannelInboundHandler Adapterですが、この2つの違いは何ですか?最も大きな違いはSimpleChannelInboundHandlerがデータを受信すると自動的にreleaseがデータ占有のBytebufferリソース(Bytebuffer.release()を呼び出す)を削除することです.なぜサーバ側が使えないのか、クライアントが要求したデータをサーバに送り返したいため、サーバ側はchannelReadメソッドが戻る前にデータを書き終わっていない可能性があるため、自動的にreleaseさせることはできません.