最初の例では、httpサーバの設立は、あなたが直接curlコマンド、または直接ブラウザアクセスを使用することができます。
第2の例では、網状ビルド顧客端末は、要求を送信アナログブラウザに要求を送信します。
ここでは、サーバを起動し、クライアントを起動し、クライアントを起動し、channelActiveアプローチでするには、サーバーにメッセージを送信するためのイニシアチブは、サーバ側channelRead0方法は、クライアントのニュースを受け取った後、クライアントは再びメッセージを返します。ChannelRead0クライアントプロセスは再び、連続的に往復運動するクライアント・メッセージで送信されたメッセージを受信します。
同様に、順番に
クライアント
1つの インポートio.netty.bootstrap.Bootstrap。 2 インポートio.netty.channel.ChannelFuture。 3 インポートio.netty.channel.EventLoopGroup。 4 インポートio.netty.channel.nio.NioEventLoopGroup。 5 輸入io.netty.channel.socket.nio.NioServerSocketChannel。 6 インポートio.netty.channel.socket.nio.NioSocketChannel。 7 8 パブリック クラスMyClientという{ 9 パブリック 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ 10 // 客户端只需要一个 11 EventLoopGroup eventLoopGroup = 新しいNioEventLoopGroup(); 12 13 のtry { 14 15 ブートストラップブートストラップ= 新しいブートストラップ()。 16 bootstrap.group(eventLoopGroup) 17 .channel(NioSocketChannel。クラス) 18 .handler(新しいMyClientInitlalizer())。 19 ChannelFuture channelFuture = bootstrap.connect( "ローカルホスト"、8899 ).sync(); 20 21 // channelFuture.channel()writeAndFlush( "最初のMSG")。//データ伝送は、実際には、アクティブ方式ハンドラに書き込まなければならない 22は 23である channelFuture.channel()closeFuture()同期(); .. 24 25 } 最後に{ 26は eventLoopGroup.shutdownGracefully(); 27 } 28 29 } 30 }
Initlalizer
輸入io.netty.channel.ChannelInitializer; 輸入io.netty.channel.ChannelPipeline; 輸入io.netty.channel.socket.SocketChannel。 輸入io.netty.handler.codec.LengthFieldBasedFrameDecoder; 輸入io.netty.handler.codec.LengthFieldPrepender; 輸入io.netty.handler.codec.string.StringDecoder; 輸入io.netty.handler.codec.string.StringEncoder; 輸入io.netty.util.CharsetUtil; パブリック クラス MyClientInitlalizerは延び ChannelInitializerが<たSocketChannel> { @Overrideは 保護 ボイド(のSocketChannel CH)initChannelをスロー例外{ ChannelPipeline ChannelPipeline = ch.pipelineを(); // ハンドラデコーダ追加 channelPipeline.addLast(新しい新しい LengthFieldBasedFrameDecoder 0,4,0,4(Integer.MAX_VALUEで、)); (channelPipeline.addLast 新しい新規。LengthFieldPrependerの(4 )) ; // デコーダ列 channelPipeline.addLast(新しい新しいStringDecoder(CharsetUtil.UTF_8)); // エンコーダ列 channelPipeline.addLast(新しい新しいStringEncoder(CharsetUtil.UTF_8)); // カスタムプロセッサ channelPipeline。 addLast(新新MyClientHandler())。 } }
ハンドラ
1 インポートio.netty.channel.ChannelHandlerContext。 2 インポートio.netty.channel.SimpleChannelInboundHandler。 3 4 インポートjava.time.LocalDateTime。 5 6 パブリック クラス MyClientHandlerは 延び SimpleChannelInboundHandlerの<string> { 7 @Override 8 保護 ボイド channelRead0(ChannelHandlerContext CTX、文字列MSG)はスロー例外{ 9 のSystem.out.println(ctx.channel()。[リモート()+ "" + MSGを); 10 のSystem.out.println( "クライアント出力:" +MSG); 11 12 ctx.writeAndFlush( "クライアントからの" + LocalDateTime.now())。 13 } 14 15 @Override 16 公共 ボイド exceptionCaught(ChannelHandlerContext CTX、Throwableの原因)スロー例外{ 17 cause.printStackTrace()。 18 ctx.close()。 19 // super.exceptionCaught(CTX、原因)。 20 } 21 22 @Override 23 公共 ボイド channelActive(ChannelHandlerContext CTX)がスロー例外{ 24 。ctx.channel()writeAndFlush( "クライアントからの挨拶!"); // チャネルが接続された後、送信データ 25 スーパー.channelActive(CTX); 26である } 27 }
ハンドルを切断
サーバコード内のサーバーは、最初の例と似て、initlializer、クライアントは、コードを掲示ない、一貫しています。
パブリック クラス MyServerHandlerは延び SimpleChannelInboundHandler <文字列> { @Overrideが 保護 ボイド channelRead0(ChannelHandlerContext CTX、文字列MSG)をスロー例外{ のSystem.out.println(ctx.channel()[リモート() + "" + MSG)。 ctx.writeAndFlush( "serevberから" + UUID.randomUUID())。// 消息返回 } @Overrideは 公共 ボイド exceptionCaught(ChannelHandlerContext CTX、Throwableの原因)をスロー例外{ cause.printStackTrace()。 ctx.close(); // super.exceptionCaught(CTX、原因)。 } }