netty篇-组件和设计

channel-类似于一个socket

一个Channel对应一个socket。提供了基本的io操作。bind()、connect()、read()、write()。

EmbeddedChannel:

LocalServerChannel:

NioDatagramChannel:

NioSctpChannel:

NioSocketChannel:

 

EventLoop-提供事件的触发时机

eventLoop主要用在:控制流、多线程处理、并发

 

 

ChannelFuture-可以提供异步回调实现

主要用在异步通知。netty中所有的io操作都是异步的。netty提供了channelFuture接口,有个addListener()方法注册了一个ChannelFutureListener,使其在某个操作完成时得到通知。

 

ChannelHandler和ChannelPipeline-有了组件之后,我们可以在这里写我们的业务逻辑

ChannelHandler主要用来处理出站入站的信息,大部分的业务逻辑会集中在其中。举例来说就是:ChannelInboundHandler主要用来处理入站数据逻辑,大部分的业务代码通常驻留在一个或者多个ChannelInboundHandler中。

ChannelPipeline则提供了ChannelHandler链的容器,并定义了用于在该链上传播入站和出站事件流的api。他们的关系类似于这样:

ps:出站和入站是从客户端和服务器端的方向来说的。如果从客户端角度来看,一个消息从客户端应用程序->服务端,称这些事件是出站的;反之从服务器端->客户端的方向,称这些事件是入站的。如果从服务器端角度来看,则是相反的。

 

编码器和解码器-写业务逻辑之前,我们需要把消息转换成我们可以识别的格式

当通过netty发送或者接受一个消息的时候,都会发生一次数据转换。入站消息会被解码,出站消息会被编码,网络中传输的,都是一些字节。

对于特定的需要,netty为编码器和解码器提供了不同类型的抽象类。netty内置有很多的编解码器,默认都实现了ChannelOutboundHandler或者ChannelInboundHandler接口。

对于每个入站数据,channelRead方法都会被重写。在调用之后,它将由预置解码器提供的decode()方法进行解码,解码完成之后将已转码的字节转发给下一个ChannelPipeline中的下一个ChannelInboundHandler。出站模式则相反

抽象类SimpleChannelInboundHandler

这个类是netty提供的默认的ChannelHandler实现,我们只需要继承这个类,并实现它的特定方法即可简单实现我们需要的定制化功能。

 

引导-客户端和服务器的启动器Bootstrap

引导分为客户端引导和服务端引导,客户端引导是 Bootstrap 服务端引导对应的是 ServerBootstrap。

客户端一般是connect连接,服务端则是bind绑定端口。

不同的地方在于EventLoopGroup的不同,客户端只有一个EventLoopGroup,用来处理客户端发出去的连接事件。而服务端则拥有两个EventloopGroup,一个用来处理bind事件,处理服务端的入站事件,还有一套EventLoopGroup用来处理客户端发起来的连接事件,一旦服务端接受了客户端的连接,第二个EventLoopGroup就会给它分配一个EventLoop。

posted @ 2021-06-28 18:03  StivenYang  阅读(50)  评论(0编辑  收藏  举报