当前位置:网站首页>SimpleChannelInboundHandler使用总结
SimpleChannelInboundHandler使用总结
2022-08-02 06:18:00 【旷野历程】
当客户端到达服务端时,建立连接的有 channelActive 和 handlerAdded ,关闭连接的有 channelInactive 和 handlerRemoved ,应该如何决定使用?
代码:
import com.xh.netty.common.config.NettyConfig;
import com.xh.netty.common.constant.NettyCons;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.util.AttributeKey;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class WebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
@Override
public void channelActive(ChannelHandlerContext channelHandlerContext) throws Exception {
System.out.println("channelActive");
}
@Override
public void handlerAdded(ChannelHandlerContext channelHandlerContext) throws Exception {
log.info("handlerAdded");
}
@Override
public void channelInactive(ChannelHandlerContext channelHandlerContext) throws Exception {
System.out.println("channelInactive");
}
@Override
public void handlerRemoved(ChannelHandlerContext channelHandlerContext) throws Exception {
log.info("handlerRemoved");
}
}运行结果
handlerAdded
channelActive
channelInactive
handlerRemovedChannelHandler 的生命周期
ChannelHandler 接口定义 handlerAdded 和 handlerRemoved 两个方法,也就是 ChannelHandler 的生命周期从 add 开始,remove 结束。让我们看看源码中是怎样的一个过程对ChannelHandler的处理。
1.Channel 创建连接
当新的客户端连接到服务端之后,会依次调用 ChannelHandler 中的方法,完成 ChannelPipeline 对 ChannelHandler 的添加。channel 会注册到 EventLoop 中并激活当前 channel。
执行顺序:handlerAdded -> channelRegistered -> channelActive
2.EventLoop 监听
当客户端发送请求信息到服务端时,会调用 channelRead 方法完成请求信息读取;读取完成后则调用 channelReadComplete 方法,表示此次读事件完成。
执行顺序:channelRead -> channelReadComplete
3.Channel 关闭连接
客户端完成请求后,会关闭连接(或者长时间没有请求被服务端主动close掉),关闭连接时,服务端检测到该 channel 的关闭,则会依次调用 ChannelHandler 中的方法完成注销删除。
执行顺序:channelInactive -> channelUnregistered -> handlerRemoved
4.Channel 异常
当channel在读取数据时发生异常,则抛出,此时会调用 ChannelPipeline.fireExceptionCaught() 方法,后续依次调用 ChannelHandler.exceptionCaught() 方法来完成异常处理。
总结:
ChannelHandler 生命周期过程:
handlerAdded –> channelRegistered –> channelActive –> channelRead –> channelReadComplete –> channelInactive –> channelUnregistered –> handlerRemoved。
在执行期间都会伴随着 exceptionCaught 方法进行异常捕获。
边栏推荐
猜你喜欢

The stock price has repeatedly hit new lows, and the real estate SaaS giant is in trouble. How should Mingyuan Cloud transform and save itself?

awk语法-01-基础语法(命令、选项、内部变量)

DNS resolution process
![[数据集][VOC]男女数据集voc格式6188张](/img/72/d3e46a820796a48b458cd2d0a18f8f.png)
[数据集][VOC]男女数据集voc格式6188张

实验7 MPLS实验

数据库概论之MySQL表的增删改查1

Unity Shader学习(七)纹理图像的简单使用

能与观众实时互动的Claper

MySQL Advanced SQL Statements

MySQL driver jar package download -- nanny tutorial
随机推荐
返回文件名问题
Connection reset by peer 问题解析
See the picture to understand | How to choose sales indicators to measure the health of business growth
Connection reset by peer problem analysis
PMP新考纲通关秘籍,告别抓瞎
Expert Insights | 3 ways to seize innovation opportunities in a downturn
交换网络----三种生成树协议
8/1 思维+扩展欧几里得+树上dp
MySQL Advanced Statements (1)
nodejs的安装和全局配置(超详细哦)
[Dataset][VOC] Male and female dataset voc format 6188 sheets
chrome 插件开发指南
Summer Summary (3)
optional
GCC编译器技术解析
punch day05
【npm install 报错问题合集】- npm ERR! code ENOTEMPTY npm ERR! syscall rmdir
chrome plugin development guide
解决Pytorch模型在Gunicorn部署无法运行或者超时问题
Nodejs installation and global configuration (super detailed)