netty 关闭连接_Netty原理和基础(二)

《高并发实战》之Netty基础和原理

048257dfc374a0d9398c69c617eee0ce.png

前言

    这周末去参加了个音乐节玩的比较嗨,文章也没做整理,加上最近阿里云主机被攻击,搞得很烦,这几天在处理云主机的问题,后续也会把遇到的木马、挖矿程序整理出来。这篇接着上一篇,对netty基础和原理做个收尾。

五、详解Channel通道

通过上面的学习,通道是Netty网络中最重要的核心,代表着网络连接。通道是通信的主题,负责同对端进行网络通信,可以写入数据到对端,也可以从对端读取数据。所有有必要堆通道做个整理。

5.1 构造函数

 protected AbstractChannel(Channel parent) {
            this.parent = parent;//父通道        this.unsafe = this.newUnsafe();//底层的NIO通道,完成实际的NIO操作        this.pipeline = new DefaultChannelPipeline(this);//一个通道一个流水线    }

从构造函数中我们可以明显看出AbstractChannel内部有一个pipeline属性,表示处理器的流水线。初始化通道时,pipeline属性会初始化成DefaultChannelPipeline实例。

其中parent属性表示通道的父通道。对于连接监听通道来说(如NioServerSocketChannel实例),他的父通道就是null,而对于每一条传输通道(如NioSocketChannel实例)他的父通道就是接收到该连接的服务连接监听通道。

几乎所有的通道实现类都继承了AbstractChannel抽象类,都拥有上面的parent和pipeline两个属性成员。

5.2 成员方法

看完构造函数,继续 了解他的成员方法。

  1. ChannelFuture connect(SocketAddress address)

    用于连接远程服务器。参数是远程服务器的地址,调用后会立即返回,返回值为负责连接操作的异步任务ChannelFuture。此方法在客户端的传输通道使用。

  2. ChannelFuture bind(SocketAddress address)

    绑定监听地址,开始监听新的客户端连接。此方法在服务器的新连接监听和接收通道使用。

  3. ChannelFuture close()

    关闭通道连接,返回连接关闭的ChannelFuture异步任务。如果需要在连接正式关闭后执行其他操作,则需要为异步任务设置回调方法;或者调用ChannelFuture异步任务的sync( ) 方法来阻塞当前线程,一直等到通道关闭的异步任务执行完毕。

  4. Channel read()

    读取通道数据,并且启动入站处理。具体来说,从内部的JavaNIO Channel通道读取数据,然后启动内部的Pipeline流水线,开启数据读取的入站处理。此方法的返回通道自身用于链式调用。

  5. ChannelFuture write(Object o)

    启程出站流水处理,把处理后的最终数据写到底层Java NIO通道。此方法的返回值为出站处理的异步处理任务。

  6. Channel flush()

    缓冲区中的数据立即写出到对端。并不是每一次write操作都是将数据直接写出到对端,write操作的作用在大部分情况下仅仅是写入到操作系统的缓冲区,操作系统会将根据缓冲区的情况,决定什么时候把数据写到对端。而执行flush()方法立即将缓冲区的数据写到对端。

5.3 嵌入式通道EmbeddedChannel

这是一个模拟入站和出站的通道,主要用于测试。

047aa6fc96a9dd2f1b489811dfcb797a.png

六、详解Handler业务处理器

Reactor反应器获取到IO事件后,分发到Handler业务处理器,由handler完成IO操作和业务处理。

整个IO处理的流程包括:通道读数据、数据包解码、业务处理、目标数据编码、数据包写入通道。

黑体字的四个流程是Netty底层负责完成,我们要做的就是业务处理。

前面已经介绍过,从应用程序开发人员的角度来看,有入站和出站两种类型操作。

· 入站处理,触发的方向为:自底向上,Netty的内部(如通道)到ChannelInboundHandler入站处理器。

· 出站处理,触发的方向为:自顶向下,从ChannelOutboundHandler出站处理器到Netty的内部(如通道)。按照这种方向来分,前面数据包解码、业务处理两个环节——属于入站处理器的工作;后面目标数据编码、把数据包写到通道中两个环节——属于出站处理器的工作。

6.1 入站处理器

到数据进入Netty通道后,netty就会触发入站处理器,这里我们就学习一下ChannelInboundHandler。

  1. channelRegistered

    当通道注册完后,Netty会调用fireChannelRegistered,触发通道注册事件。通道会启动该入站操作的流水线处理,在通道注册过的入站处理器Handler的channelRegistered方法,会被调用到。

  2. channelActive

    当通道激活完成后,Netty会调用fireChannelActive,触发通道激活事件

  3. channelRead

    当通道缓冲区可读,Netty会调用fireChannelRead,触发通道可读事件

  4. channelReadComplete

    当通道缓冲区读完,Netty会调用fireChannelReadComplete,触发通道读完事件

  5. channelInactive

    当连接被断开或者不可用,Netty会调用fireChannelInactive,触发连接不可用事件

  6. exceptionCaught

    通道处理过程发生异常时,Netty会调用fireExceptionCaught,触发异常捕获事件

6.2 出站处理器

当业务

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值