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事件。

相关推荐
ouynagda1 分钟前
嵌入式Linux i.MX6ULL系统移植学习笔记
linux·笔记·学习
Mikko74 分钟前
JVM 线上排查实战(六):JFR 怎么用?JDK 8 要不要加 UnlockCommercialFeatures、jfr 命令在哪、录的文件为什么读不了
java·运维·jvm·后端
yi0117 分钟前
DAY22: LeetCode 733:图像渲染——从二维网格开始理解 DFS 和 BFS
数据结构·笔记·python·算法·leetcode·深度优先·宽度优先
白猫不黑15 分钟前
AI自动化漏洞挖掘从入门到进阶超详细学习路线
人工智能·学习·web安全·网络安全·信息安全·渗透测试·自动化
奇牙coding19 分钟前
GPT-5.5 API 报 401 但 GPT-5.4 正常怎么办?不是 Key 失效,是 Organization 头的强制校验变了
java·网络·gpt·ai
a努力。28 分钟前
Context-State-Memory三重信息架构揭秘
java·服务器·前端
~kiss~35 分钟前
Chroma 的边际相关性检索 - Maximal Marginal Relevance,检索的多样性
学习
sbjdhjd1 小时前
智能体开始“动手”之后:OpenAI越权事件、Anthropic算力资本化与开放权重模型竞逐 | AI与SI行业日报整理(9月29日—10月6日)
大数据·人工智能·经验分享·笔记·ai·chatgpt·开源
captain3761 小时前
Maven
java·后端·idea
上位机妹子1 小时前
从零理解 EF Core:用 Minimal API 给「工作项看板」建模(小白笔记)
笔记