3、ネッティー第二の例、網状の使用は、クライアントとサーバーの通信を構築します

最初の例では、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、原因)。
    } 
}

 

おすすめ

転載: www.cnblogs.com/amibandoufu/p/11442688.html