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

相关推荐
jason成都4 小时前
RTKLIB 的 Java 移植版来了:rtklib-java v3.3.0 功能全景
java·gnss·rtklib·rtklib_java
前进的李工4 小时前
Agent 学习笔记 02:Harness 与工作流怎么理解
笔记·学习·agent·工作流·harness
LazyHunter94 小时前
JDK 28:Java 下一步方向解析与新特性展望
java·jdk
m0_639906944 小时前
Java 重写 Override 与重载 Overload 区别、访问修饰符、static 关键字
java·开发语言
GIS数据转换器4 小时前
基于CIM的城市智慧供热监管服务平台
java·大数据·开发语言·人工智能·后端·物联网·struts
m4Rk_5 小时前
【论文阅读】Agent记忆机制(114):MemoryTax——当 Agent 能自主搜索历史,专门的记忆系统还划算吗?
论文阅读·人工智能·学习·开源·github
m0_639906945 小时前
SpringBoot自动配置原理
java·spring boot·后端
海鸥-w6 小时前
数据库冗余字段设计笔记
java·数据库·笔记·oracle
工具派6 小时前
PDF签名贴上去为什么发虚?尺寸、DPI与坐标的边界实测
java·python·pdf
萧瑟余晖6 小时前
Spring Data综合实战与调优详解
java·后端·spring