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事件
入栈方向事件
| 事件名 | 触发时机 |
|---|---|
channelRegistered | Channel注册到某个EventLoop后触发 |
channelUnregistered | Channel从某个EventLoop取消注册后触发 |
channelActive | Channel已经建立,注册并激活,处于可用状态,一般用于client进入 |
channelInactive | Channel失活,处于不可用状态,处于生命周期的末端,一般与exceptionCaught一起用于client退出 |
channelRead | Channel每读取一次底层协议(如tcp)的缓冲区到自身ByteBuf缓冲区就会触发一次,底层缓冲区中内容可能一次读取不完 |
channelReadComplete | netty检测该次读取后,底层协议缓冲区读干净了,触发该事件 |
userEventTriggered | 用户事件被触发,常用于心跳机制 |
channelWritabilityChanged | Channel的可写状态发生改变 |
exceptionCaught | Channel中抛出异常时触发,一般与channelInactive一起用于client退出 |
出栈方向事件
| 事件名 | 触发时机 |
|---|---|
bind | 服务端绑定端口事件 |
connect | 客户端发起连接事件 |
disconnect | 客户端断开连接事件 |
close | channel关闭事件,使用tcp时,与disconnect没有区别 |
deregister | channel从某个EventLoop取消注册事件 |
read | 拦截ChannelHandlerContext.read() |
write | Channel写消息时触发 |
flush | Channel发送并刷新缓冲区时触发 |