内置通信传输模式
- NIO:io.netty.channel.socket.nio 使用java.nio.channels包作为基础–基于选择器的方式
- Epoll:io.netty.channel.epoll由JNI驱动的epoll()和非阻塞IO.这个传输支持只有在Linux上可用的多种特性,如果SO_REUSEPORT,比NIO传输更快,而且是完全非阻塞的。将NioEventLoopGroup替换为
EpollEventLoopGroup,并且将NioServerSocketChannel.class替换为EpoolServerSocketChannel.class即可 - OIO:io.netty.channel.socket.oio使用java.net包作为基础–使用阻塞流
- Local:io.netty.channel.local可以在VM内部通过管道进行通信的本地传输
- Embedded:io.netty.channel.embedded Embedded传输,允许使用ChannelHandler而又
不需要一个真正的基于网络的传输,在测试ChannelHandler实现时非常有用
引导 Bootstrap
Bootstrap是Netty框架的启动类和主入口类,分为客户端类Bootstrap和服务器类ServerBootstrap两种。
网络编程里,"服务器"和"客户端"实际上表示了不同的网络行为:换句话说,是监听传入的连接还是建立到一个或者多个进程的连接。
因此,有两种类型的引导:一种用于客户端(简单地称为Bootstrap),而另一种(ServerBootstrap)用于服务器。无论应用程序使用哪种协议或者处理哪种类型地数据,唯一决定它使用哪种引导类的是它是作为一个客户端还是作为一个服务器
ServerBootstrap和Bootstrap
ServerBootstrap将绑定到一个端口,因为服务器必须要监听连接,而Bootstrap则是由
想要连接到远程节点的客户端应用程序所使用的.第二个区别可能更加明显。引导一个客户端只需要一个EventLoopGroup,但是一个ServerBootstrap则需要两个(也可以是同一个实例),因为服务器需要两组不同的Channel,第一组将只包含一个ServerChannel,代表服务器自身的已绑定到某个本地端口的正在监听的套接字。而第二组将包含所有已创建的用来传入客户端连接(对于每个服务器已经接受的连接都有一个)的Channel.与ServerChannel相关联的EventLoopGroup将分配一个负责为传入连接请求创建Channel的EventLoop。一旦连接被接受,第二个EventLoopGroup就会给它的Channel分配一个EventLoop
ChannelInitializer
负责初始化Channel.Netty提供了一个特殊的ChannelInboundHandlerAdapater子类:它定义了
下面的方法:
protected abstract void initChannel(C ch) throws Exception;
这个方法提供了一种将多个ChannelHandler添加到一个ChannelPipeline中的简便方法,你只需要
简单地向Bootstrap或者ServerBootstrap的实例提供你的ChannelInitializer实现即可,并且一旦
Channel被注册到了它的EventLoop之后,就会调用你的initChannel()版本。在该方法返回之后,
ChannelInitializer的实例将会从ChannelPipeline中移除它自己,所以,在我们自己的应用程序中,
如果存在着某个Handler只使用一次的情况,也可以伪造Channelinitializer,用完以后将自己从ChannelPipeline中移除自己,比如授权Handler,某客户端第一次连接登录以后,进行授权检查,检查通过后,就可以把这个