事件循环组【实际是一个死循环】
bossGroup:负责处理连接
workerGroup:负责具体工作
ServerBootstrap:服务引导启动器,NIO的辅助工具
handler方法是为bossGroup提供的处理方式
childHandler方法是为workGroup提供的处理方式
ChannelFuture
异步操作执行完,没有等待执行完成再返回,直接返回的Future。
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 200)
.attr(AttributeKey.newInstance("name"), "godme");
option就好比object,一个对象的属性必然是可列举的。
attr就好比map,只是一个容器,可有可无,灵活多变。
根本来看,option是既有程序的控制参数,控制已有的,不受我们操作的底层流程。
因而可以枚举,肯定可以设置,只是参数个数的问题。
但是attr是我们自己程序中用来在流程中传递元素的手段,底层代码必定用不上,个数、类型也未可知。
它就是我们附带信息并传递信息的一个手段,类似于session。
public class TestServer {
public static void main(String[] args) throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).
childHandler(new TestServerInitializer());
ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
channelFuture.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
public class TestServerInitializer extends ChannelInitializer<SocketChannel>{
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("httpServerCodec", new HttpServerCodec());
pipeline.addLast("testHttpServerHandler", new TestHttpServerHandler());
}
}
public class TestHttpServerHandler extends SimpleChannelInboundHandler<HttpOb