Netty-SimpleChannelInboundHandler使用总结_旷野历程的技术博客_51CTO博客

当客户端到达服务端时,建立连接的有 channelActive 和 handlerAdded ,关闭连接的有 channelInactive 和 handlerRemoved ,应该如何决定使用?

代码:

登录后复制

import com.xh.netty.common.config.NettyConfig;
import com.xh.netty.common.constant.NettyCons;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.util.AttributeKey;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class WebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {

@Override  
public void channelActive(ChannelHandlerContext channelHandlerContext) throws Exception {  
    System.out.println("channelActive");  
}  

@Override  
public void handlerAdded(ChannelHandlerContext channelHandlerContext) throws Exception {  
    log.info("handlerAdded");  
}  

@Override  
public void channelInactive(ChannelHandlerContext channelHandlerContext) throws Exception {  
    System.out.println("channelInactive");  
}  

@Override  
public void handlerRemoved(ChannelHandlerContext channelHandlerContext) throws Exception {  
    log.info("handlerRemoved");  
}  

}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.

运行结果

登录后复制

handlerAdded
channelActive
channelInactive
handlerRemoved

  • 1.
  • 2.
  • 3.
  • 4.

ChannelHandler 的生命周期

ChannelHandler 接口定义 handlerAdded 和 handlerRemoved 两个方法,也就是 ChannelHandler 的生命周期从 add 开始,remove 结束。让我们看看源码中是怎样的一个过程对ChannelHandler的处理。

1.Channel 创建连接

当新的客户端连接到服务端之后,会依次调用 ChannelHandler 中的方法,完成 ChannelPipeline 对 ChannelHandler 的添加。channel 会注册到 EventLoop 中并激活当前 channel。

执行顺序:handlerAdded -> channelRegistered -> channelActive

2.EventLoop 监听

当客户端发送请求信息到服务端时,会调用 channelRead 方法完成请求信息读取;读取完成后则调用 channelReadComplete 方法,表示此次读事件完成。

执行顺序:channelRead -> channelReadComplete

3.Channel 关闭连接

客户端完成请求后,会关闭连接(或者长时间没有请求被服务端主动close掉),关闭连接时,服务端检测到该 channel 的关闭,则会依次调用 ChannelHandler 中的方法完成注销删除。

执行顺序:channelInactive -> channelUnregistered -> handlerRemoved

4.Channel 异常

当channel在读取数据时发生异常,则抛出,此时会调用 ChannelPipeline.fireExceptionCaught() 方法,后续依次调用 ChannelHandler.exceptionCaught() 方法来完成异常处理。

总结:

ChannelHandler 生命周期过程:

handlerAdded –> channelRegistered –> channelActive –> channelRead –> channelReadComplete –> channelInactive –> channelUnregistered –> handlerRemoved。

在执行期间都会伴随着 exceptionCaught 方法进行异常捕获。


原网址: 访问
创建于: 2023-09-14 12:12:59
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论