1. 程式人生 > >netty03(基於4.1.23.Final 版本的案例)

netty03(基於4.1.23.Final 版本的案例)

    基於前面的netty01netty02修改一下版本,可以點進去的

  將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();
    }
}