NioEventLoopGroup是一个多线程的event loop(事件环?)。Netty针对不同的情况提供了多(18)种EventLoopGroup的实现,因为这里是一个服务端应用,所以使用NioEventLoopGroup。new出来两个对象,通常第一个叫boss,接收进来的连接。第二个,通常叫worker,因为当boss接收了连接之后会把链接注册给worker,让worker来处理后面的通信。每个EventLoopGroup使用线程数以及他们如何被映射到Channel由EventLoopGroup的实现决定,并且可能可以通过构造函数来指定。
下面是NioEventGroup的部分构造函数。
什么是Netty的Channel。按照文档的介绍,可以简单理解为socket的一个抽象,或者是IO的操作,包括IO的读写,连接,绑定等。Channel会给使用者提供以下功能:
当前的状态(连接是否已经打开或者连上)
channel的配置参数。(接收的缓冲区大小)
socket,io相关的操作(读写等)
处理io事件的管道
详细的以后再说
ServerBootstarp是一个配置server的帮助类,你可以使用Channel自己来配置,但是会比较枯燥,所以,大多数情况下直接使用这个ServerBootstrap就好。
NioServerSocketChannel是一个Channel的实例,用来处理进来的连接(上面说的channel的功能)。
ChannelInitializer是一个特殊的Handler,作用是帮助用户配置Channel。通常的作用是把ChannelHandler放到ChannelPipeline(管道)里面,请求会进入到Pipeline,处理就按照这个Pipeline配置的Handler来。DiscardServerHandler就是一种Handler。
用来配置Channel的参数。顺道看一下ServerBootstrap的定义,这个ServerBootstrap是用来启动ServerChannel,ServerChannel实际上就是一个Channel。我们这里实现的是一个TCP/IP server,所以,可以设置tcpNoDelay和keepAlive等参数。具体设置看文档。
public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel>{}
option的为接收连接的配置,也就是给boss用,后面的childOption为worker配置选项。
万事俱备,只欠把绑定端口配置上去然后启动服务。main方法里面。
恭喜,搞定。用个tcp 客户端连接试试~~可以看到连接成功,发送了3字节,然后因为是Discard,所以没有返回。
收到的数据让我们稍微修改一下代码,以便看看我们收到的数据。按照之前的例子,需要再channelRead方法里面做修改。
@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { final ByteBuf in = (ByteBuf) msg; try { System.out.println(in.toString(CharsetUtil.US_ASCII)); } finally { in.release(); } }msg可以直接转换成ByteBuf对象,然后用ByteBuf的toString方法,设置ASCII参数装成string打印出来。
运行起来然后可以直接在浏览器输入localhost:8080访问,就能看到传过来的数据。
写一个Echo Server