Netty学习笔记

0.NIO三大组件(channel、selector、buffer)

1.channel:

相当于socket,和socket相比是非阻塞式的

2.selector:

和一个线程组成一个整体,对channel进行轮询,对事件进行监听和派发

3.buffer:

数据缓存区,在内存中通过减少系统调用次数来提高传输速度

1.骨架

java 复制代码
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();

ServerBootstrap serverBootstrap = new ServerBootstrap();

serverBootstrap.group(bossGroup,workerGroup)
        .channel(NioServerSocketChannel.class)
        .childHandler(new ChannelInitializer<SocketChannel>(){
            @Override
            protected void initChannel(SocketChannel socketChannel) throws Exception {
                // 添加处理器
                socketChannel.pipeline().addLast(new ChannelHandler());
                ...
            }
        });
ChannelFuture f = serverBootstrap.bind(2333).sync();// 绑定端口,返回future
f.channel().closeFuture().sync();// 监听关闭事件,若有关闭指令便阻塞式关闭服务器
// sync:阻塞式等待,执行到该指令时候线程会阻塞,直到执行完毕才执行下一行代码

1.ServerBootstrap

服务器启动类,用于包装组件。包括:EventLoopGroup、ServerChannel、ChannelHandler
2.EventLoopGroup

事件处理线程组(通常为一个线程)
3. ServerChannel

处理网络通信的方法,通常使用NioServerSocketChannel(非阻塞)
4. ChannelHandler

用于每个客户端连接通道定义不同的处理方式

2. ChannelHandler

channelhandler常见实现类:

SimpleChannelInboundHandler<>:

SimpleChannelInboundHandler是一个泛型类,在定义时需要指定它所处理的消息类型。例如,SimpleChannelInboundHandler<ByteBuf>表示这个处理器专门处理ByteBuf类型的入站消息

ChannelInboundHandlerAdapter、ChannelOutboundHandlerAdapter:

channelRead方法中接收的是Object类型的消息,这意味着它可以处理任何类型的入站(出站)消息

ChannelInitializer:

用于为serverBootstrap添加一系列的channelhandler处理逻辑

channelhandler常见事件触发函数:

channelRegistered、channelUnregistered:

当使用ServerBootstrap启动一个服务器时,新接受的客户端连接对应的Channel会被注册到EventLoop。当一个客户端连接关闭时,对应的Channel会从EventLoop中注销,从而触发channelUnregistered事件。

channelActive、channelInactive:

在一个TCP客户端连接到服务器后,如果连接成功建立,客户端的Channel就会触发channelActive事件。如果一个服务器端与客户端的连接因为网络故障或者客户端主动断开而关闭,服务器端对应的Channel就会触发channelInactive事件。

channelRead、channelRead0:

在处理一个HTTP请求时,当整个请求体都被读取完毕后,对应的Channel会触发channelReadComplete事件。

exceptionCaught:

如果在解析接收到的数据时发生格式错误,或者在发送数据时出现I/O错误,对应的Channel就会触发exceptionCaught事件。

userEventTriggered:

如果在一个自定义的定时任务中,当定时时间到达时,可以通过fireUserEventTriggered方法触发一个用户自定义事件,从而在ChannelHandler中触发userEventTriggered事件。

相关推荐
雨中奔跑的小孩2 分钟前
爬虫案例学习6
爬虫·学习
volcanical12 分钟前
MoCo 对比自监督学习
人工智能·学习·机器学习
咩咩觉主29 分钟前
Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定
java·unity·游戏引擎
Q_192849990635 分钟前
基于Spring Boot的房屋租赁管理系统
java·spring boot·后端
天天进步201538 分钟前
Java全栈项目 - 学生档案管理系统
java·开发语言
清弦墨客44 分钟前
【蓝桥杯】43696.小数第n位
java·c语言·c++·python·蓝桥杯
机器视觉李小白1 小时前
Halcon 机器视觉案例 之 药剂液面高度测量
图像处理·笔记·halcon·机器视觉
Best_Me071 小时前
最短路径C++
java·c++·算法
码到成龚1 小时前
SQL server学习08-使用索引和视图优化查询
数据库·学习
我叫啥都行1 小时前
计算机基础知识复习12.20
java·jvm·笔记·后端·sql