1、我们在使用netty的是有都会存在将channelBuffer的数据处理成相应的String或者自定义数据。而这里主要是介绍管道里面存在的上行和下行的数据处理方式

  2、通过一张图片来看一下具体管道中的实现过程

  

  一个Channel中包括一个Socket、一个ChannelPipeline。一个ChannelPipeline中有一个ChannelSink和多个ChannelHandler。ChannelHandler分为两种:UpstremHandler、DownstreamHandler。

  不论是读数据还是写数据都要经过Channel中的ChannelPipeline。读数据的过程是从Socket到ChannelPipeline,由ChannelPipeline交给里面的UpstreamHandler(或者叫做InBoundHandler)从下到上依次处理 。写数据时,由要经过ChannelPipeline里面在DownStreamHandler(或者是OutBoundHandler)由上到下依次处理。

  3、因为UpstremHandler与DownstreamHandler的实现方式大同小异,我这里写的例子是UpstremHandler的例子

  1. package com.troy.application.upstream;
  2.  
  3. import org.jboss.netty.bootstrap.ServerBootstrap;
  4. import org.jboss.netty.channel.ChannelPipeline;
  5. import org.jboss.netty.channel.ChannelPipelineFactory;
  6. import org.jboss.netty.channel.Channels;
  7. import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
  8. import org.jboss.netty.handler.timeout.IdleStateHandler;
  9. import org.jboss.netty.util.HashedWheelTimer;
  10.  
  11. import java.net.InetSocketAddress;
  12. import java.util.concurrent.ExecutorService;
  13. import java.util.concurrent.Executors;
  14.  
  15. public class Server {
  16.  
  17. public static void main(String[] args) {
  18.  
  19. //声明服务类
  20. ServerBootstrap serverBootstrap = new ServerBootstrap();
  21.  
  22. //设定线程池
  23. ExecutorService boss = Executors.newCachedThreadPool();
  24. ExecutorService work = Executors.newCachedThreadPool();
  25.  
  26. //设置工厂
  27. serverBootstrap.setFactory(new NioServerSocketChannelFactory(boss,work));
  28.  
  29. //设置管道流
  30. serverBootstrap.setPipelineFactory(new ChannelPipelineFactory() {
  31. @Override
  32. public ChannelPipeline getPipeline() throws Exception {
  33. ChannelPipeline channelPipeline = Channels.pipeline();
  34. //添加处理方式
  35. channelPipeline.addLast("idle",new IdleStateHandler(new HashedWheelTimer(),,,));
  36. channelPipeline.addLast("handler1",new Handler1());
  37. channelPipeline.addLast("handler2",new Handler2());
  38. return channelPipeline;
  39. }
  40. });
  41.  
  42. //设置端口
  43. serverBootstrap.bind(new InetSocketAddress());
  44. }
  45. }
  1. package com.troy.application.upstream;
  2.  
  3. import org.jboss.netty.buffer.ChannelBuffer;
  4. import org.jboss.netty.channel.ChannelHandlerContext;
  5. import org.jboss.netty.channel.MessageEvent;
  6. import org.jboss.netty.channel.SimpleChannelHandler;
  7. import org.jboss.netty.channel.UpstreamMessageEvent;
  8.  
  9. public class Handler1 extends SimpleChannelHandler {
  10. @Override
  11. public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
  12. ChannelBuffer channelBuffer = (ChannelBuffer) e.getMessage();
  13. byte[] array = channelBuffer.array();
  14. String message = new String(array);
  15. System.out.println("handler1"+message);
  16. ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(),message,e.getRemoteAddress()));
  17. }
  18. }
  1. package com.troy.application.upstream;
  2.  
  3. import org.jboss.netty.channel.ChannelHandlerContext;
  4. import org.jboss.netty.channel.MessageEvent;
  5. import org.jboss.netty.channel.SimpleChannelHandler;
  6.  
  7. public class Handler2 extends SimpleChannelHandler {
  8. @Override
  9. public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
  10. String message = (String) e.getMessage();
  11. System.out.println("handler2"+message);
  12. }
  13. }

  说明:这里最重要的两个方法是sendUpstream和sendDownstream。这两个方式在上行和下行的处理基本上是一样的。在源码里面handler的处理都会存在sendUpstream和sendDownstream。这个两个方法也是多重处理的基础。

netty之管道处理流程的更多相关文章

  1. ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程

    从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...

  2. Netty Nio启动全流程

    Netty Nio启动全流程 1. 各组件之间的关系 说明:EventLoopGroup类似线程池,EventLoop为单线程,每个EventLoop关联一个Nio Selector,用于注册Chan ...

  3. ASP.NET机制详细的管道事件流程(转)

    ASP.NET机制详细的管道事件流程 第一:浏览器向服务器发送请求. 1)浏览器向iis服务器发送请求网址的域名,根据http协议封装成请求报文,通过dns解析请求的ip地址,接着通过socket与i ...

  4. 详细图解 Netty Reactor 启动全流程 | 万字长文 | 多图预警

    本系列Netty源码解析文章基于 4.1.56.Final版本 大家第一眼看到这幅流程图,是不是脑瓜子嗡嗡的呢? 大家先不要惊慌,问题不大,本文笔者的目的就是要让大家清晰的理解这幅流程图,从而深刻的理 ...

  5. 一文搞懂 Netty 发送数据全流程 | 你想知道的细节全在这里

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 在<Netty如何高效接收网络数据 ...

  6. Netty服务端创建流程及组件职责

    public class NettyServer { public static void main(String[] args) throws InterruptedException { NioE ...

  7. Netty 源码学习——客户端流程分析

    Netty 源码学习--客户端流程分析 友情提醒: 需要观看者具备一些 NIO 的知识,否则看起来有的地方可能会不明白. 使用版本依赖 <dependency> <groupId&g ...

  8. Netty学习(二)使用及执行流程

    Netty简单使用 1.本文先介绍一下 server 的 demo 2.(重点是这个)根据代码跟踪一下 Netty 的一些执行流程 和 事件传递的 pipeline. 首先到官网看一下Netty Se ...

  9. Http请求处理流程 管道流程 MVC扩展HttpModule

    HttpApplication  封装了管道处理请求的所有事件 HttpModule 对HttpApplication中事件的扩展 HttpHandler   处理程序  每个请求都要经过Handle ...

随机推荐

  1. mxnet 神经网络训练和预测

    https://mxnet.incubator.apache.org/tutorials/basic/module.html import logging import random logging. ...

  2. 【[SHOI2015]脑洞治疗仪】

    我太sb啦 合并的时候又漏了,又漏了,又漏了 我个sb 这是个板子题,并不知道为什么SHOI2015会考这么板子的题,但是我又sb了,又sb了,又sb了,又没有1A 显然我是凉了 这道题有三个操作 区 ...

  3. HDU 3292 【佩尔方程求解 && 矩阵快速幂】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=3292 No more tricks, Mr Nanguo Time Limit: 3000/1000 M ...

  4. ROBOCOPY——Windows 的可靠文件复制

    复制指定类型文件 (-s :含子目录  不包括空目录) 复制所有 (-e :含子目录  包括空目录) 复制指定成层级内的 (-lev:n 仅复制源目录树的前 n 层) 复制排除给定类型后的 (-xf) ...

  5. spring AOP 代理(静态与动态+使用cglib实现)

    一.没有代理模式 缺点: 1.工作量特别大,如果项目中有多个类,多个方法,则要修改多次. 2.违背了设计原则:开闭原则(OCP),对扩展开放,对修改关闭,而为了增加功能把每个方法都修改了,也不便于维护 ...

  6. Faster Alternatives to glReadPixels and glTexImage2D in OpenGL ES

    In the development of Shou, I’ve been using GLSL with NEON to manipulate image rotation, scaling and ...

  7. JS异步编程 (1)

    JS异步编程 (1) 1.1 什么叫异步 异步(async)是相对于同步(sync)而言的,很好理解. 同步就是一件事一件事的执行.只有前一个任务执行完毕,才能执行后一个任务.而异步比如: setTi ...

  8. CSS Variables

    CSS原生变量(CSS自定义属性) 示例地址:https://github.com/ccyinghua/Css-Variables 一.css原生变量的基础用法 变量声明使用两根连词线"-- ...

  9. oracle带输入输出参数存储过程(包括sql分页功能)

    记录一下,免得以后忘记了又要到处去找. begin /*这里不能直接执行select语句但可以直接执行update.delete.insert语句*/ end里面不能接执行select语句,声明会话级 ...

  10. OC实现 单向链表

    需要实现一个消息队列,队列具有 FIFO 特点,即先入先出,在这里采用单向链表实现队列逻辑. 本次要实现的队列要求: 1. 节点可以存放任意类型数据 2. 线程安全 简单说明一下: 1. 创建CFNo ...