netty03(基於4.1.23.Final 版本的案例)
阿新 • • 發佈:2018-11-08
基於前面的netty01和netty02修改一下版本,可以點進去的
將maven依賴版本改了一下
<!-- netty版本:netty-5.0.0.Alpha2 http://files.cnblogs.com/files/applerosa/netty-5.0.0.Alpha2.7z--> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.23.Final</version> </dependency>
啟動類還是一樣的
package com.netty.nettys01; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; public class DiscardServer { private int port; public DiscardServer(int port) { super(); this.port = port; } public void run() throws Exception {/*** * NioEventLoopGroup 是用來處理I/O操作的多執行緒事件迴圈器, * Netty提供了許多不同的EventLoopGroup的實現用來處理不同傳輸協議。 在這個例子中我們實現了一個服務端的應用, * 因此會有2個NioEventLoopGroup會被使用。 第一個經常被叫做‘boss’,用來接收進來的連線。 * 第二個經常被叫做‘worker’,用來處理已經被接收的連線, 一旦‘boss’接收到連線,就會把連線資訊註冊到‘worker’上。 * 如何知道多少個執行緒已經被使用,如何對映到已經建立的Channels上都需要依賴於EventLoopGroup的實現, * 並且可以通過建構函式來配置他們的關係。 */ EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); System.out.println("準備執行埠:" + port); try { /** * ServerBootstrap 是一個啟動NIO服務的輔助啟動類 你可以在這個服務中直接使用Channel */ ServerBootstrap b = new ServerBootstrap(); /** * 這一步是必須的,如果沒有設定group將會報java.lang.IllegalStateException: group not * set異常 */ b = b.group(bossGroup, workerGroup); /*** * ServerSocketChannel以NIO的selector為基礎進行實現的,用來接收新的連線 * 這裡告訴Channel如何獲取新的連線. */ b = b.channel(NioServerSocketChannel.class); /*** * 這裡的事件處理類經常會被用來處理一個最近的已經接收的Channel。 ChannelInitializer是一個特殊的處理類, * 他的目的是幫助使用者配置一個新的Channel。 * 也許你想通過增加一些處理類比如NettyServerHandler來配置一個新的Channel * 或者其對應的ChannelPipeline來實現你的網路程式。 當你的程式變的複雜時,可能你會增加更多的處理類到pipline上, * 然後提取這些匿名類到最頂層的類上。 */ b = b.childHandler(new ChannelInitializer<SocketChannel>() { // (4) @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new DiscardServerHandler());// demo1.discard // ch.pipeline().addLast(new // ResponseServerHandler());//demo2.echo // ch.pipeline().addLast(new // TimeServerHandler());//demo3.time } }); /*** * 你可以設定這裡指定的通道實現的配置引數。 我們正在寫一個TCP/IP的服務端, * 因此我們被允許設定socket的引數選項比如tcpNoDelay和keepAlive。 * 請參考ChannelOption和詳細的ChannelConfig實現的介面文件以此可以對ChannelOptions的有一個大概的認識。 */ b = b.option(ChannelOption.SO_BACKLOG, 128); /*** * option()是提供給NioServerSocketChannel用來接收進來的連線。 * childOption()是提供給由父管道ServerChannel接收到的連線, * 在這個例子中也是NioServerSocketChannel。 */ b = b.childOption(ChannelOption.SO_KEEPALIVE, true); /*** * 繫結埠並啟動去接收進來的連線 */ ChannelFuture f = b.bind(port).sync(); /** * 這裡會一直等待,直到socket被關閉 */ f.channel().closeFuture().sync(); } finally { /*** * 關閉 */ workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { int port; if (args.length > 0) { port = Integer.parseInt(args[0]); } else { port = 8080; } new DiscardServer(port).run(); /* System.out.println("server:run()");*/ } }
訊息接受和返回的修改了,修改了繼承類,由於版本不一樣,導致重寫的方法也不一樣
註釋什麼的。依據前面的兩篇有詳細的說明
package com.netty.nettys01; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import static org.apache.http.Consts.UTF_8; public class DiscardServerHandler extends SimpleChannelInboundHandler{ @Override public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf in=(ByteBuf)msg; System.out.println(in.toString(UTF_8)); String reMsg="66666"; ByteBuf in2= Unpooled.copiedBuffer(reMsg.getBytes()); ctx.writeAndFlush(in2); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); } }