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

相关推荐
plainGeekDev1 小时前
单例模式 → object 声明
android·java·kotlin
用户298698530142 小时前
Java 实现 Word 文档文本与图片提取的方法
java·后端
SimonKing3 小时前
铁子,IntelliJ IDEA 2026.1.3来了,升不升?
java·后端·程序员
咖啡八杯14 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
用户128526116021 天前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java
Linsk1 天前
组件 = 模板 + 业务逻辑
java·前端·vue.js
星沉远浦1 天前
用Gemini高效解决Java代码报错难以定位的问题
java
用户298698530141 天前
Word 文档字符级格式化:Java 实现方案详解
java·后端
笨鸟飞不快1 天前
从单个服务到集群:一次完整的性能排查复盘
java·前端