Handler在netty中,无疑占据着非常重要的地位。Handler与Servlet中的filter很像,通过Handler可以完成通讯报文的解码编码、拦截指定的报文、统一对日志错误进行处理、统一对请求进行计数、控制Handler执行与否。一句话,没有它做不到的只有你想不到的。
Netty中的所有handler都实现自ChannelHandler接口。按照输出输出来分,分为ChannelInboundHandler、ChannelOutboundHandler两大类。ChannelInboundHandler对从客户端发往服务器的报文进行处理,一般用来执行解码、读取客户端数据、进行业务处理等;ChannelOutboundHandler对从服务器发往客户端的报文进行处理,一般用来进行编码、发送报文到客户端。
Netty中,可以注册多个handler。ChannelInboundHandler按照注册的先后顺序执行;ChannelOutboundHandler按照注册的先后顺序逆序执行,如下图所示,按照注册的先后顺序对Handler进行排序,request进入Netty后的执行顺序为:
先举一个例子吧
bossGroup = new NioEventLoopGroup(); workerGroup = new NioEventLoopGroup(); try { //NIO服务的辅助启动类 ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 128) .option(ChannelOption.SO_KEEPALIVE, true) .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000*60*5) .handler(new LoggingHandler(LogLevel.DEBUG))//设置父类handler .childHandler(new ChannelInitializer<SocketChannel>(){ @Override protected void initChannel(SocketChannel socketChannel) throws Exception { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast("idleHandler",new TIdleHandler(AdapterParam.READIDLE, AdapterParam.WRITEIDLE, AdapterParam.ALLIDLE)); //解码器 pipeline.addLast("decoder", new TDecoder()); //编码器 pipeline.addLast("encoder", new TEncoder()); //业务处理器 pipeline.addLast("handler", new THandler()); } }); b.bind(port).sync();
这里加了四个handler两个outbound handler(idlehander , encoder)和两个inbound handler(decoder , handler) 添加顺序分别为:
idlehandler , decoder , encoder , handler ,
那么inbound的handler执行顺序,也就是收到消息的执行顺序为decoder , handler ,inbound执行顺序为先添加先执行
outbound的handler执行顺序,也就是发送消息的执行顺序为 encoder , idlehandler ,outbound的执行顺序为先添加的后执行
曾经遇到一个问题,在心跳监测中,也就是idlehandler中用ctx发送消息,发现对端接收不到,后来才发现,ctx.writeandflush方法是执行下一个handler,按照这个handler添加顺序,那么久不会执行encoder ,所以消息可能会发送不出去,但是用channel发送消息是重新跑一边所有的outbound handler也就是说会先执行encoder,这样才能将消息发送出去
相关推荐
NULL 博文链接:https://bijian1013.iteye.com/blog/2340632
NULL 博文链接:https://dingran.iteye.com/blog/1930178
Android Handler 执行绪教学####★UI执行绪和工作执行绪不能跨执行绪沟通,因此Android提供许多方式让WorkerThread去存取UI执行绪。 (1)Activity.runOnUiThread(Runnable) (2)View.post(Runnable) (3)View....
按照一定顺序执行虚拟指令处理函数(Handler)可完成程序关键代码的保护,其为软件逆向分析者攻击的重点对象。针对“动态提取,静态分析”的Handler攻击方法,提出一种基于Handler混淆增强的虚拟机保护方法。运用...
* 此时只会会执行Run()方法,但是不会开启新的线程 */ //Handler h = new Handler(); //h.post(r); /* * 在java中真正开启线程的方法是这样的。 */ Thread t = new Thread(r); t.start(); ...
通过 Foxit PDF Preview Handler 可以让你的OutLook2007预览PDF 文件。 Foxit PDF Preview Handler 1.1 For XP
handler发送和接收message的各种方式 (1)Handler.SendEmptyMessage(what); (2)Handler.obtainMessage(int what, int arg1, int arg2, Object obj).sendYToTarget(); (3)Message.obtain(handler, MESSAGE_MSG, 0, 0, ...
整理了Handler的各种使用方法
android 中Handler 的几种写法,很简单的demo,大神简单修改下,用的是Handler.Callback,的方法
赠送jar包:netty-handler-4.1.73.Final.jar; 赠送原API文档:netty-handler-4.1.73.Final-javadoc.jar; 赠送源代码:netty-handler-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:netty-handler-4.1.73....
Android Handler类详解 Android Handler类详解 Android Handler类详解 Android Handler类详解
分享一份teamcenter流程设计常用handler处理程序的使用总结及参数设置示例,希望能帮到大家!
Handler 推荐用法 demo
demo01: 通过handler.post()的方法可以更新ui demo02: 一秒钟切换一张图片 demo03: 霓虹灯动态效果的显示 demo04: 倒计时,停止倒计时 demo05: 通过handler.sendMessage和handleMessage发送处理消息 demo06: message...
资源包括如何在一个activity A里激活另一个activity B。 然后在两个activity之间用handler传输数据。在activity A里定义全局变量handler,用sendMessage来发数据,在handler里数据以消息队列的方式发送。
android:handler简单用法
1.handler是什么? 2.handler怎么用? 3.为什么要用handler?
js访问handler中任意方法; 访问一般处理程序;
感谢慕课网,浅谈handler
这里使用post()将多个线程提交到Handler的MessageQueue里面,这样线程就会顺序执行,这样任务所操作的对象在同一时间里就不会有多个线程同时操作了,也就实现了同步操作了。同时注意,队列是同步操作的一个重要手段...