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網状閉弁