Netty - Channel

66 阅读2分钟

Channel

Netty中Channel的概念与NIO中的Channel差不多,管理着两个端系统之间的连接通道。通过Channel可以读入另一端发送的数据,或向另一端发送数据。

write 方法 与 flush方法

Channel中管理着一片缓冲区,执行write方法只是把数据先写到缓冲区而不是立刻发送出去,当触发一定条件时才会发送缓冲区中内容。可以使用flush方法将缓冲区内容发送出去,又或者直接调用writeAndFlush方法,直接发送数据。

ChannelFuture

Channel的一些方法是异步操作的,通过返回的ChannelFuture对象可以获取任务线程中的执行结果。
ChannelFutuer.sync() 阻塞当前线程,当任务线程产生结果后,继续执行当前线程。
ChannelFutuer.addListener(Callback)不阻塞当前线程,当任务线程产生结果后,由任务线程执行回调函数。

创建或关闭连接

Channel的连接创建和关闭是异步的。
当使用Bootstrap.connect()Channel.close()方法时,此时当前线程是非阻塞的,该方法将真正的连接任务交给了EventLoopGroup中的一个线程并返回一个ChannelFuture对象。

Bootstrap client = new Bootstrap()..;
ChannelFuture connectFuture = client.connect();
connectFuture.sync(); //等待建立连接,创建channel
//连接后代码
ChannelFuture closeFuture = connectFuture.channel().closeFuture(); //等待channel关闭连接断开
closeFuture.sync();
//连接断开后代码

Channel事件

入栈方向事件

事件名触发时机
channelRegisteredChannel注册到某个EventLoop后触发
channelUnregisteredChannel从某个EventLoop取消注册后触发
channelActiveChannel已经建立,注册并激活,处于可用状态,一般用于client进入
channelInactiveChannel失活,处于不可用状态,处于生命周期的末端,一般与exceptionCaught一起用于client退出
channelReadChannel每读取一次底层协议(如tcp)的缓冲区到自身ByteBuf缓冲区就会触发一次,底层缓冲区中内容可能一次读取不完
channelReadCompletenetty检测该次读取后,底层协议缓冲区读干净了,触发该事件
userEventTriggered用户事件被触发,常用于心跳机制
channelWritabilityChangedChannel的可写状态发生改变
exceptionCaughtChannel中抛出异常时触发,一般与channelInactive一起用于client退出

出栈方向事件

事件名触发时机
bind服务端绑定端口事件
connect客户端发起连接事件
disconnect客户端断开连接事件
closechannel关闭事件,使用tcp时,与disconnect没有区别
deregisterchannel从某个EventLoop取消注册事件
read拦截ChannelHandlerContext.read()
writeChannel写消息时触发
flushChannel发送并刷新缓冲区时触发