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

相关推荐
九皇叔叔4 分钟前
【02】SpringBoot3 MybatisPlus 加入日志功能
java·mysql·mybatis·日志·mybatisplus
java1234_小锋4 分钟前
什么是Java可重入锁?
java·开发语言
不会c+5 分钟前
Spring和Springboot的区别
java·spring boot·spring
懈尘5 分钟前
基于Spring Boot与LangChain4j的AI驱动新闻系统设计与工程实现
java·大数据·人工智能·spring boot·后端·langchain
不会c+6 分钟前
Spring详解(二)IOC控制反转
java·开发语言
LYS_06188 分钟前
寒假学习(6)(C语言6+模数电6)
c语言·学习·模数电基础
一碗甜汤ᐝ8 分钟前
论文阅读笔记-FastVLM: Efficient Vision Encoding for Vision Language Models
论文阅读·笔记·语言模型
知识分享小能手8 分钟前
Oracle 19c入门学习教程,从入门到精通,Oracle 用户管理与权限分配 —— 语法详解与实战案例(13)
数据库·学习·oracle
智者知已应修善业9 分钟前
【输出方形点阵】2024-11-1
c语言·c++·经验分享·笔记·算法
●VON10 分钟前
在 OpenHarmony 上打造智能 TodoList:基于 Flutter 的标签分类与动态过滤实践
学习·flutter·openharmony·布局·技术