ネッティーの研究ノート

3回のネッティーレッスン迅速かつ効率的なイベント駆動型のフレームワーク、拡張性、および高性能
 4は、最初のhelloworldを書いたが、サービスを破棄しないことは適切ではありません。

この方法は、本来クライアント読み取った
2つの読み出し方法および例外ハンドラは
 、処理msg.release()ミュート、データを受信し
 、異常な閉鎖線ダイレクトリンク
パッケージio.netty.example.discard、

インポートio.netty.buffer.ByteBufと、

io.netty.channel.ChannelHandlerContextインポート、
インポートio.netty.channel.ChannelInboundHandlerAdapter; 

/ * * 
 。*処理するサーバー・サイドチャネルA 
 * / 
パブリック クラス DiscardServerHandler ChannelInboundHandlerAdapter {拡張// (1)

    @Override 
    公共 のボイド channelRead(CTX ChannelHandlerContextを物体MSG){ //(2)
         // サイレント受信したデータを廃棄する。 
        ((ByteBuf)MSG).releaseを(); // (3)
    } 

    @Override 
    公共 ボイド exceptionCaught(CTX ChannelHandlerContextは、原因のThrowableである){ // (4)
         // 閉じます例外が接続を上げたときである。
        cause.printStackTrace(); 
        ctx.close(); 
    } 
} 

実際には、通常の処理の両方にOH動作である
メッセージを読み取る際に
@Override 
公共 ボイドchannelRead(ChannelHandlerContext CTX、MSGオブジェクト){ 
    ByteBuf  = (ByteBuf)MSG;
     試み{
         一方)(.isReadable){ // (1) 
            システム。OUTの.print((チャー.readByte()) システムOUT .flush(); 
        } 
    } 最後に{ 
        ReferenceCountUtil.release(MSG)。@ (2)
    } 
} 2)と実質的に同等である().release 1 )低サイクル効率、変更することができ、異なる何も理由を、理解していない
:.システムではありませんOUT(.println .toString (io.netty.util.CharsetUtil.US_ASCII))


其实最主要的メイン方法调用
パッケージio.netty.example.discard。
    
輸入io.netty.bootstrap.ServerBootstrap; 

輸入io.netty.channel.ChannelFuture; 
輸入io.netty.channel.ChannelInitializer; 
輸入io.netty.channel.ChannelOption。
輸入io.netty.channel.EventLoopGroup; 
輸入io.netty.channel.nio.NioEventLoopGroup; 
輸入io.netty.channel.socket.SocketChannel。
輸入io.netty.channel.socket.nio.NioServerSocketChannel。
    
/ * * 
 *すべての着信データを破棄します。
 * / 
パブリック クラスDiscardServer { 
    
    プライベート int型ポート。
    
    公共 DiscardServer(int型ポート){
         この.port = ポート。
    } 
    
    公共 ボイドラン()例外{スロー
        EventLoopGroup bossGroup = 新しい NioEventLoopGroupを(); // (1) 
        EventLoopGroup workerGroup = 新しいNioEventLoopGroup();
        試す{ 
            ServerBootstrapのB = 新しい ServerBootstrap()。// (2)
            b.group(bossGroup、workerGroup)
             .channel(NioServerSocketChannel。クラス// (3)制定了nioserver 
             .childHandler(ChannelInitializer <たSocketChannel>(){ // (4)指定了初始化类
                 @Override
                  公共 ボイドinitChannel(のSocketChannel CH)は例外{スロー
                     。ch.pipeline()addLast(新しいDiscardServerHandlerを())。
                 } 
             })
             .OPTION(ChannelOption.SO_BACKLOG、128// (5) 
             .childOption(ChannelOption.SO_KEEPALIVE、)。// (6)
    
            // バインドし、着信接続を受け入れることを始めます。
            ChannelFutureのF = b.bind(ポート).sync(); // (7)
    
            // サーバソケットがクローズされるまで待ちます。
            // この例では、これは発生しませんが、あなたは優雅にするためにそれを行うことができます
             // あなたのサーバーをシャットダウンします。
            。f.channel()closeFuture()同期()。
        } 最後に{ 
            workerGroup.shutdownGracefully()。
            bossGroup.shutdownGracefully(); 
        } 
    } 
    
    パブリック 静的 ボイドメイン(文字列[]引数)例外{スロー
         のint =ポート8080 もし(args.length> 0 ){ 
            ポート = Integer.parseInt(引数[0 ]); 
        } 

        新しい新しいDiscardServer(ポート).RUN(); 
    } 
} 

NioEventLoopGroup概念マルチスレッド、および作業者がボス有し
ヘルパークラスのチャネルを置き換えるために使用することができるServerBootstrapに移動しない
設定サーバ・クラス
5マークは、あなたが他のパラメータのChannelOptionを表示することができ、パイプラインのパラメータを表します。改善するためのコンパイラ

上で上記の実際のハンドラの書き込み


5 以上が、返信がない、返事が戻って書かれて受け取った後、サーバーを書かなければなりませんでしたか?
@Override 
    公共 ボイドchannelRead(ChannelHandlerContext CTX、MSGオブジェクト){ 
        ctx.write(MSG); // (1) 
        ctx.flush(); // (2)
    } 

6。書き込み時間サーバ、時間等がプロトコルである

9 デフォルトByteBufで、あなたはPOJOを置き換えることができ
デコーダ修正
@Override
保護された ボイドデコード(ChannelHandlerContext CTX、ByteBuf において、リスト<OBJECT> アウト){
     場合(.readableBytes)< 4 ){
         返します
    } 

    アウト .add(新しい UnixTime(.readUnsignedInt()))。
} 
timeclienthandler也修改类型
@Override 
公共 ボイドchannelRead(ChannelHandlerContext CTX、オブジェクトMSG){ 
    UnixTime M = (UnixTime)MSG。
    システム。アウト.println(M)。
    ctx.close(); 
}

また、サーバTimeServerHandler変更でき
@Override 
公共 ボイドchannelActive(ChannelHandlerContext CTX){ 
    ChannelFuture F = ctx.writeAndFlush(新しい新しいUnixTimeを()); 
    f.addListener(ChannelFutureListener.CLOSE); 
} 
処理に変更エンコーダ部である持っていない
パッケージio.netty.example.time; 

パブリック クラスChannelOutboundHandlerAdapter {延びTimeEncoder 
    @Override 
    公共 ボイドライト(ChannelHandlerContext CTXは、MSG、ChannelPromiseプロミスオブジェクト){ 
        UnixTime M = (UnixTime)MSG; 
        ByteBufは、符号化された ctx.alloc =()バッファ(。4。);
        encoded.writeInt((int型)m.value()); 
        (プロミスエンコード)ctx.write; //は、(1)
    } 
} 
原則の束をまとめた後、同様に彼の後継者timeencoder変更
パブリック クラス MessageToByteEncoderを拡張TimeEncoder <UnixTime> { 
    @Overrideが
    保護 ボイドエンコードを(ChannelHandlerContext CTX、UnixTime MSG、ByteBuf OUT ){
         OUT .writeInt((INT )msg.value()); 
    } 
} 

10網状閉弁

 

おすすめ

転載: www.cnblogs.com/genestart/p/11355715.html