Netty4.0.36使用入门

以前曾经阅读过Netty的源代码,对其整体的IO,线程模型都还算是比较了解,但是感觉以前的东西都忘记了,而且当时读的时候也比较乱,所以这次准备再重新走一遍,因为5.0版本的正式版还没有出来,所以就选择了4.0.36final版本。。。


最开始还是先看看最简单的使用吧,做一个简单的http服务器,返回hello world


先创建一个Handler来处理读取的数据:

package fjs;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandler;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.nio.charset.Charset;

/**
 * Created by fjs-alienware on 2016/5/22.
 */
public class InHandler extends ChannelInboundHandlerAdapter {
    /**
     *
     * @param ctx              当前连接的上下文环境
     * @param msg              其实是读取到的数据
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf buf = (ByteBuf)msg;
        System.out.println(buf.toString(Charset.forName("UTF8")));

        ByteBuf outBuf = ByteBufAllocator.DEFAULT.buffer();
        outBuf.writeBytes("hello world".getBytes());
        ctx.writeAndFlush(outBuf);
        buf.release();
        ctx.close();
    }


}

这里在channelRead方法里面来处理读取到的数据,代码也很简单,将读取到的数据打印出来,然后发送hello world数据,并关闭连接,这样在在浏览器里面就可以看到 hello world字符了


那么接下来需要一个服务器的启动入口:

package fjs;

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.NioEventLoop;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * Created by fjs-alienware on 2016/5/22.
 */
public class Fjs {
    public static void main(String args[]) {
        EventLoopGroup bossGroup = new NioEventLoopGroup();      /***监听channel将会放到这个ioLoop里面去*/
        EventLoopGroup workerGroup = new NioEventLoopGroup();    /**接收到的外部channel将会在这个里面处理**/

        try {
            ServerBootstrap b = new ServerBootstrap();
            /**
             * 初始化服务器环境
             */
            b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer() {

                /**
                 * 接收到新的连接将会调用这里来对channel进行初始化
                 * @param ch            获取到的外部连接
                 * @throws Exception
                 */
                @Override
                protected void initChannel(SocketChannel ch) throws Exception {
                    ch.pipeline().addLast(new InHandler());
                }
            }).option(ChannelOption.SO_BACKLOG, 128).option(ChannelOption.SO_KEEPALIVE, true);
            ChannelFuture f = b.bind(8000).sync();
            f.channel().closeFuture().sync();         /**等待监听socket的关闭**/
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}


好像整个API还是比较稳定的,跟自己以前读的时候并没有太大的变化,好久没有写Java代码了,有点手生啊。


你可能感兴趣的:(Netty4.0.36使用入门)