4 - Channelhandler和ChannelPipeline
4.1 Channelhandler
4.1.1 Channel声明周期(状态事件)
| 方法 | 描述 |
|---|---|
| ChannelUnregistered | Channnel已创建,但是未注册到EventLoop |
| ChannelRegistered | Channnel已注册到EventLoop |
| ChannelActive | Channnel活动状态(已连接到远程节点),可以发送接收数据 |
| ChannelInactive | Channnel未连接到远程站点 |
4.1.2 Channelhandler生命周期(状态事件)
从channelPipeLine中添加删除时触发
| 方法 | 描述 |
|---|---|
| handlerAdded | 当把handler添加到channelPipieLine中时 |
| handlerRemoved | 从pipeLine中移除时 |
| exceptionCaught | handler处理过程中异常时调用 |
4.1.3 ChannelInBoundHandler接口--入站数据及状态变化
ChannelInBoundHandlerAdapter--调用read后如果不继续调用ctx.fireChannelRead(msg)将消息传给下一个channel(即丢弃消息),则需要手动释放(ReferenceCountutil.release(msg))
SimpleChannelInBoundHandler -- 已封装,自动释放资源
| 方法 | 描述 |
|---|---|
| channelRead | 从channel中读取数据时 |
| channelReadComplete | 所有数据都已从Channel中读取之后调用(可能之前channelRead已多次调用) |
| userEventTriggered | 当ChannelInBoundHandler.fireuserEventTriggered()被调用时触发 |
4.1.3 ChannelOutBoundHandler 接口--出站数据及拦截操作
a). 可按需推迟操作或者事件.
b). 方法被channel、channelPipeLine及channelHandlerContext调用
| 方法 | 描述 |
|---|---|
| bind | |
| connect | |
| disconnect | |
| close | |
| deregister | |
| read(ChannelhandlerContext) | 当请求从channel读取数据时调用 |
| flush | 写数据到远端 |
| write | write后不传递消息时需要手动释放,ReferenceCountutil.release(msg);promise.setSuccess(); |
4.2 ChannelPipeLine-channelhandler实例链
a). 可动态修改
b). fireChannelread之类方法都是调用ChannelPipeLine中下一个handler中对应方法.
| 方法 | 描述 |
|---|---|
| addFist | |
| addBefore | |
| addAfter | |
| addlast | |
| remove | |
| replace | 以上都是处理内部channelHandler的方法 |
4.3 ChannelHandlerContext接口-handler和pipeLine之间的连接
4.4 异常处理
4.4.1 入站异常
a). 异常从出发的那一点开始流经pipiLine
b). exceptionCaught默认实现是将异常转发下一个handler处理
c). 如果到达尾部还未处理则被记录为未处理
public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf>{
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){
cause.printStackTrace();
ctx.close();
}
}
4.4.2 出站异常
a). 每个出站操作都返回一个ChannelFuture
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise){
promise.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if( !future.isSuccess() ){
future.cause().printStackTrace();
future.channel().close();
}
}
})
}
4 - Channelhandler和ChannelPipeline的更多相关文章
- 【Netty】ChannelHandler和ChannelPipeline
一.前言 前面学习了Netty的ByteBuf,接着学习ChannelHandler和ChannelPipeline. 二.ChannelHandler和ChannelPipeline 2.1 Cha ...
- Netty实战六之ChannelHandler和ChannelPipeline
1.Channel的生命周期 Interface Channel定义了一组和ChannelInboundHandler API密切相关的简单但功能强大的状态模型,以下列出Channel的4个状态. C ...
- Netty 系列四(ChannelHandler 和 ChannelPipeline).
一.概念 先来整体的介绍一下这篇博文要介绍的几个概念(Channel.ChannelHandler.ChannelPipeline.ChannelHandlerContext.ChannelPromi ...
- netty中的ChannelHandler和ChannelPipeline
netty中的ChannelHandler和ChannelPipeline ChannelHandler 家族 https://www.w3cschool.cn/essential_netty_in_ ...
- Netty的ChannelHandler,ChannelHandlerContext,ChannelPipeline
本小节一起学习一下ChannelHandler,ChannelHandlerContext,ChannelPipeline这三个Netty常用的组件,不探究它们的底层源码,我们就简单的分析一下用法 首 ...
- ChannelHandler,ChannelHandlerContext,ChannelPipeline
本小节一起学习一下ChannelHandler,ChannelHandlerContext,ChannelPipeline这三个Netty常用的组件,不探究它们的底层源码,我们就简单的分析一下用法 首 ...
- Netty学习笔记(番外篇) - ChannelHandler、ChannelPipeline和ChannelHandlerContext的联系
这一篇是 ChannelHandler 和 ChannelPipeline 的番外篇,主要从源码的角度来学习 ChannelHandler.ChannelHandler 和 ChannelPipeli ...
- Netty 框架学习 —— ChannelHandler 与 ChannelPipeline
ChannelHandler 1. Channel 生命周期 Channel 的生命周期状态如下: 状态 描述 ChannelUnregistered Channel 已经被创建,但还未注册到 Eve ...
- Netty学习摘记 —— 再谈ChannelHandler和ChannelPipeline
本文参考 本篇文章是对<Netty In Action>一书第六章"ChannelHandler和ChannelPipeline",主要内容为ChannelHandle ...
随机推荐
- ES6学习之函数扩展
函数默认参数 function test(x = 1, y = 2) { return x + y } test(5, 6) test() 若默认参数在必须参数之前,要想取得默认参数,只有当传入的值为 ...
- 【jQuery】slice()方法的使用
[jQuery]slice()方法的使用 slice()方法:从已有的数组中返回选定的元素. 语法: arrayObj.slice(start, end) ...
- js提交数据时需判断是点击事件还是回车键
使用回车键实质还是点击事件==回车时将焦点聚居在某个标签上. Html代码: <div id="btlogin" class="btlogin">& ...
- ADO.NET 对象
(一)OleDbConnection 使用COM组件链接 (二)ADO.NET 对对数据库访问做了优化: 1.SqlConnection 用于建立和Sql Server服务器连接的类,表示打开数据库 ...
- DevExpress 显示进度条
1.使用了DevExpress的WaitDialogForm WaitDialogForm waitDialogForm = null; new Thread((ThreadStart)delegat ...
- 进程中t.start(), t.daemon() t.jion()的使用
#!/usr/bin/env python import multiprocessing import time def f1(a1): time.sleep(2) print(a1) if __na ...
- 杭电acm 1034题
Problem Description A number of students sit in a circle facing their teacher in the center. Each st ...
- Gulp的学习和使用
Gulp是一种直观.自动化构建的工具. Gulp是基于Node和NPM,安装教程点这里. 什么是Gulp? Gulp使用了node.js的流控制系统,使其(Gulp)构建更快,因为它不需要将临时文件/ ...
- 1.1 xss原理分析与剖析(2)
0×01 反射型XSS: 反射XSS是XSS分类中最多的,他们原理是下面这样: Hacker——发现存在反射XSS的URL——根据输出点的环境构造XSS代码——进行编码.缩短(可有可无,是为了增加迷惑 ...
- AI学习指南
这是一份关于如何学习深度学习以及为AI面试做准备的指南,个人觉得写的很不错,文章中还有很多有用的资料链接,源自机器之心,下面是文章的链接: https://mp.weixin.qq.com/s/kKB ...