以前曾经阅读过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<SocketChannel>() {
/**
* 接收到新的连接将会调用这里来对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代码了,有点手生啊。