热门课程

免费试听

上课方式

开班时间

当前位置: 首页 -   文章 -   新闻动态 -   正文

Netty的核心模块组件都有哪些?

知了堂姐
2024-07-08 17:22:16
0

一、Bootstrap、ServerBootstrap概述

Bootstrap是指引导的意思,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty中的Bootstrap类是客户端程序的启动引导类,ServerBootstrap是服务的启动引导类。

常见的方法有

(1).该方法用于服务器端,用来设置两个EventLoop

pulbic ServerBootstrap group(EventLoopGroup parentGroup,EventLoopGroup childGroup)

(2).该方法用于客户端,用来设置一个EventLoop

public B group(EventLoopGroup group)

(3).用来给ServerChannel添加配置

public  B option(ChannelOption option,T value)

(4).该方法用来设置一个服务器端的通道实现

public B channel(Class channelClass)

(5).用来给接收到的通道添加配置

public  ServerBootstrap childOption(ChannelOption childOption,T value)

(6).该方法用来设置业务处理类(自定义的handler),对应workerGroup.

public ServerBootstrap childHandler(ChannelHandler childHandler)

(7).该方法用于服务器端,用来设置占用的端口号

public ChannelFuture bind(int inetPort)

(8).该方法用于客户端,用来连接服务器

public ChannelFuture connect(String inetHost,int inetPort)

(9).该方法用来设置业务处理类,对应bossGroup.

public ChannelFuture handler(ChannelHandler childHandler)

二、Future和ChannelFuture

Netty中所有的IO操作都是异步的,不能立刻得到消息是否被正确处理。但是可以过一会等他执行完成或者直接注册监听,具体的实现就是通过Future和ChannelFuture,他们可以注册一个监听,当操作执行成功或者失败时监听会自动触发注册的监听事件。

常见的方法有

(1).返回当前正在执行IO操作通道

Channel channel()

(2).等待异步操作执行完毕,当调用的sync()方法所返回的ChannelFuture里面的动作一定是已经完成了。所以调用的sync()的目的就是保证ChannelFuture已经完成了。

ChannelFuture sync()

三、Channel

1.Netty网络通信的组件,能够用于执行网络I/O操作

2.通过Channel可获得当前网络连接的通道状态

3.通过Channel可获得网络链接的配置参数(例如缓冲区大小)

4.Channel提供异步的网络I/O操作(如建立连接,读写,绑定端口),异步调用意味着任何I/O调用都将立即返回,并且不保证在调用结束时所请求的I/O操作已经完成。

5.调用立即返回一个ChannelFuture实例,通过注册监听器到ChannelFuture上,可以I/O操作成功、失败或取消息时回调通知调用方。

6.支持关联I/O操作与对应的处理程序

7.不同的协议、不同的阻塞类型的链接都有不同的Channel类型与之对应,常用的Channel类型:

  • (1)NIOSocketChannel ,异步客户端TCP Socket连接;
  • (2)NioServerSocketChannel,异步的服务器端TCP Socket连接;
  • (3)NioDatagramChannel,异步UDP连接;
  • (4)NioSctpChannel,异步的客户端Stcp连接;
  • (5)NioSctpServerChannel,异步的Sctp服务器连接,这些通过覆盖了UDP和TCP网络IO及文件IO。

四、Selector

1.Netty基于Selector对象实现IO多路复用,通过Selector一个线程可以监听多个连接的Channel事件。

2.当向一个Selector中注册Channel后,Selector内部的机制就可以自动不断的查询(select)这些注册的Channel是否有已就绪的I/O时间(例如可读、可写、网络连接完成等),这样程序就可以很简单的使用一个线程高效的管理多个Channel。

五、ChannelHandler及其实现类

1.ChannelHandler是一个接口,处理I/O时间或者拦截I/O操作,并将其转发到其ChannelPipeline(业务处理链)中的下一个处理程序。

2.ChannelHandler本身并没有提供很多方法,因为这个接口有许多方法要实现,方便使用期间,可以继承他的子类。

3.ChannelHandler及实现类一览图


  • ChannelInboundHandler 用于处理入站I/O事件
  • ChannelOutboundHandler 用于处理出站I/O事件
  • ChannelInboundHanderAdapter 用于处理入站的I/O事件
  • ChannelOutboundHandlerAdapter用于处理出站的I/O事件
  • ChannelDuplexHandler 用于处理入站和出站事件

4.我们经常需要自定义一个Handler类去继承

ChannelInboundHandlerAdapter,然后通过重写响应方法实现业务逻辑,常用的要重新的方法

(1).通道就绪事件

public void channelActive(ChannelHandlerContext ctx);

(2).通道读取数据事件

public void channelRead(ChannelHandlerContext ctx, Object msg);

(3).读取数据完成事件

public void channelReadComplete(ChannelHandlerContext ctx);

六、Pipeline和ChannelPipelinee(重点)

1.ChannelPipeline是一个Handler的集合,他负责处理和拦截inbound或者outbound的事件和操作,相当于一个贯穿Netty的链。(也可以理解:ChannelPipeline是保存ChannelHandler的List,用于处理或拦截Channel的入站事件和出站事件操作)

2.ChannelPipeline实现了一种高级形式的拦截过滤模式,使用户可以完全控制事件的处理方式,以及Channel中各个的ChannelHandler如何相互交互。

3.在Netty中每个Channel都有且仅有一个ChannelPipeline与之对应,他们的组成关系如下

  • 一个Channel包含了一个ChannelPipeline中又维护了一个有ChannelHandlerContext组成的双向链表,并且每个ChannelHandlerContext中又关联着一个ChannelHandler
  • 入站事件和出站事件在一个双向链表中,入站事件会从链表Head往后传递到最后一个入站的Handler,出站事件会从链表tail往前传递到最后一个出站的Handler,两种类型的Handler互不干扰。

4.常用的方法

把一个业务处理类(handler)添加到链中的第一个位置

ChannelPipeline addFirst(ChannekHandler ... handler);

把一个业务处理类(handler)添加到链中的最后一个位置

ChannelPipeline addLast(ChannekHandler ... handler);

七、ChannelHandlerContext

1.保存Channel相关的所有上下文信息,同时关联一个ChannelHandler对象

2.即ChannelHandlerContext中包含一个具体的时间处理器ChannelHandler,同时ChannelHandlerContext中也绑定了对应的pipeline和Channel信息,方便对ChannelHandler进行调用

3.常用方法

关闭通道

ChannelFuture close();

刷新

ChannelOutboundInvoker flush();

将数据写入到ChannelPipeline中当前ChannelHandler的下一个ChannelHandler开始处理(出站)

ChannelFuture writeAndFlush(Object msg)

八、ChannelOption

1.Netty在创建Channel实例后,一般需要设置ChannelOption参数。

2.ChannelOption参数如下:

对应TCP/IP协议listen函数中的backlog参数,用来初始化服务器可连接队列大小。服务端处理客户端连接请求是按顺序处理的,所以同一时间只能处理一个客户端连接。处理多个客户端来的时候,服务端将不能处理的客户端连接请求放在队列中等待处理,backlog参数指定了队列的大小。

ChannelOption.SO_BACKLOG

一直保持连接活动状态

ChannelOption.SO_KEEPLIVE

今天就先分享到这儿,记得点赞+关注哦~

大家都在看

学java要学多久才能工作?方式不同时间不同

2024-07-08 浏览次数:0

1024程序员节,给大家送份福利

2024-07-08 浏览次数:0

内江师范学院计算机科学学院唐院长一行到我司考察

2024-07-08 浏览次数:0

路由的作用和工作原理是什么?轻松理解路由原理

2024-07-08 浏览次数:0

网络安全工程师薪资待遇怎么样?网络安全常见问题

2024-07-08 浏览次数:0

鸿蒙系统岗位多吗?鸿蒙开发岗位激增,人才紧缺!

2024-07-08 浏览次数:0
最新资讯