netty 入门 (2)

NioEventLoopGroup是一个多线程的event loop(事件环?)。Netty针对不同的情况提供了多(18)种EventLoopGroup的实现,因为这里是一个服务端应用,所以使用NioEventLoopGroup。new出来两个对象,通常第一个叫boss,接收进来的连接。第二个,通常叫worker,因为当boss接收了连接之后会把链接注册给worker,让worker来处理后面的通信。每个EventLoopGroup使用线程数以及他们如何被映射到Channel由EventLoopGroup的实现决定,并且可能可以通过构造函数来指定。

下面是NioEventGroup的部分构造函数。

pic

什么是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,所以没有返回。

pic

收到的数据

让我们稍微修改一下代码,以便看看我们收到的数据。按照之前的例子,需要再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访问,就能看到传过来的数据。

pic

写一个Echo Server

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxffs.html