Netty学習ノート4:EchoサービスとNettyプロジェクトの構築


Netty学習ノート4:EchoサービスとNettyプロジェクトの構築
文書ディレクトリ
  • Netty学習ノート4:EchoサービスとNettyプロジェクトの構築
  • Echoサービス
  • とは
  • Echoサービス側プログラム作成
  • Echoクライアント作成
  • Echoサービスにおける名詞解析
  • Echoサービスとは
  • Echoサービスは、クライアントがどのようなデータを送信するか、サービス側が対応するデータに応答する応答サービスであり、デバッグおよび検出に非常に有用なサービスである.

  • Echoサービス側プログラム作成
  • EchoServerサービス
  • 一、ポートのバインド
    二、主従スレッドグループの作成
    三、スレッドグループを起動し、チャネルタイプを指定し、伝達されたデータ内容を処理する.
    四、傍受ポート、ポートを閉じる
    五、スレッドを解放する.
    public class EchoServer {
        private int port;
        public EchoServer(int port){
            this.port=port;
        }
        public void run() throws InterruptedException {
            //       。
            EventLoopGroup bossGroup=new NioEventLoopGroup();
            EventLoopGroup workGroup=new NioEventLoopGroup();
            try{
                //        ,Netty        。        
                ServerBootstrap serverBootstrap=new ServerBootstrap();
                //             。//           ,  Channel  。
                serverBootstrap.group(bossGroup,workGroup)
                    .channel(NioServerSocketChannel.class)//                  。
                    .childHandler(new ChannelInitializer<SocketChannel>() {//              。
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new EchoServerHandler());
                        }
                    });
                System.out.println("Echo      ing");
                //    ,      。
                ChannelFuture channelFuture = serverBootstrap.bind(port).sync();
                //     ,      
                channelFuture.channel().closeFuture().sync();
            }finally {
                //    ,     。
                workGroup.shutdownGracefully();
                bossGroup.shutdownGracefully();
            }
        }
        public static void main(String[] args) throws InterruptedException {
            int port =7070;
            if(args.length>0){
                port=Integer.parseInt(args[0]);
            }
            new EchoServer(port).run();
        }
    }
    
  • 処理クラス
  • public class EchoServerHandler extends ChannelInboundHandlerAdapter {
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
           //ByteBuf Netty   ByteBuffer。
            ByteBuf data= (ByteBuf)msg;
            System.out.println("       :"+data.toString(CharsetUtil.UTF_8));
            //    ,     。
            ctx.writeAndFlush(data);
        }
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
            System.out.println("EchoServerHandle channelReadComplete");
        }
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            cause.printStackTrace();
            ctx.close();
        }
    }
    

    Echoクライアント作成
  • EchoClientプライマリクラス
  • public class EchoClient {
        private int port;
        private String host;
        public EchoClient(String host,int port){
            this.port=port;
            this.host=host;
        }
        public void start() throws InterruptedException {
            EventLoopGroup group=new NioEventLoopGroup();
            try{
                Bootstrap bootstrap =new Bootstrap();
                bootstrap.group(group)
                    .channel(NioSocketChannel.class)
                    .remoteAddress(new InetSocketAddress(host,port))
                    .handler(new ChannelInitializer<SocketChannel>() {
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new EchoClientHandler());
                        }
                    });
                //      ,connect     ,       sync,      。
                ChannelFuture channelFulture = bootstrap.connect().sync();
                //   ,         。
                channelFulture.channel().closeFuture().sync();
            }finally {
                //      NIO  。
                group.shutdownGracefully();
            }
        }
        public static void main(String[] args) throws InterruptedException {
            new EchoClient("127.0.0.1",7070).start();
        }
    }
    
  • EchoClientHandler処理クラス
  • 一、サービス側の処理類の継承とは異なるが、実質は同じである.
    二、印刷順序は、先にアクティブ化し、表示し、サービス側にチャネルを確立する方法である.
    三、サービス側のデータを読み取る.
    四、読み取り完了.チャンネルReadComplete()メソッドに入ります.
    public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
        protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
            System.out.println("Client received...."+msg.toString(CharsetUtil.UTF_8));
        }
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            System.out.println("Active");
            //      。  Unpooled   。
            ctx.writeAndFlush(Unpooled.copiedBuffer("    ,  zkf",CharsetUtil.UTF_8));
        }
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
            System.out.println("EchoClient channelReadComplete");
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            cause.printStackTrace();
            ctx.close();
        }
    }
    

    Echoサービスにおける名詞解析
  • EventLoopとEventLoopGroup
  • スレッドとスレッドグループは、前者はスレッドと理解でき、後者はスレッドグループと理解できる.
  • BootStrap

  • ブートクラスを起動し、スレッドグループを構成し、起動時にスレッドグループを同時に起動し、チャネルを開き、チャネルを初期化します.いくつかの処理を行います.
  • channel

  • channelはクライアントとサービス側が確立した接続であり、Socket接続であり、ライフサイクルがあり、確立に成功し、データを読み取り、読み取りが完了し、異常が発生するなどである.
  • channelHandlerとchannelPipeline
  • channelhandlerは,受信したデータを直接または間接的にchannelHandlerを継承するように処理する.
    channelPipelineは処理工場のようなもので、handler処理クラスを多く追加することができ、channelHandlerに入るとpipelineに追加されたhandlerで処理します.
  • 個人理解:
  • 濾水システムのように、BootStrapは濾水システムのスイッチで、それは濾水システムと水資源を接続して、それから1つの通路Channelを生成して、各通路の中に1つの浄水処理システムがあって、すなわち:ChannelHandler、各浄水システムの中に多くの処理パイプがあって、すなわち:Handler、処理パイプは生きていて、追加して、取り外すことができます.これらの動作はpipelineというツールクラスで実現されます.