问答

netty中的 SimpleChannelInboundHandler<>,后面尖括号的

作者:admin 2021-08-21 我要评论

最近在学习Netty,在官网上找到netty实现websocket的例子, 链接: https://netty.io/4.1/xref/io/... 在代码中,服务端 Initializer 添加的channelHandle有6个...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

最近在学习Netty,在官网上找到netty实现websocket的例子,
链接:https://netty.io/4.1/xref/io/...

在代码中,服务端Initializer添加的channelHandle有6个入站handler

public class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> {
    private static final String WEBSOCKET_PATH = "/websocket";
    public WebSocketServerInitializer() {
    }

    @Override
    public void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        //Inbound+Outbound
        pipeline.addLast(new HttpServerCodec());//使用默认解码器选项创建新实例
        //Inbound
        pipeline.addLast(new HttpObjectAggregator(65536));
        //Inbound+Outbound
        pipeline.addLast(new WebSocketServerCompressionHandler());
        //Inbound
        /**
         * 这个处理程序为您运行websocket服务器做了所有繁重的工作。
         * 它负责websocket握手以及控制帧(Close、Ping、Pong)的处理。文本和二进制
         * 数据帧将传递给管道中的下一个处理程序(由您实现)进行处理。
         */
        pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));
        //Inbound
        pipeline.addLast(new WebSocketIndexPageHandler(WEBSOCKET_PATH));
        //Inbound
        pipeline.addLast(new WebSocketFrameHandler());
    }
}

我对入站事件的理解是依次执行InboundHandler,所以认为每个请求进来,会进入每个InboundHandler。debug的时却不是这样,在http请求进来的时候,最后一个WebSocketFrameHandler类 没有被执行,我在WebSocketFrameHandler的前一个入站事件WebSocketIndexPageHandler <FullHttpRequest> 看到了都是调用的如下代码


ctx.writeAndFlush(res);

百度后得知从当前handler直接到pipeline的尾部执行出站方法了。
以上我都可以理解。

但是重点在于,websocket请求进来的时候,WebSocketIndexPageHandler <FullHttpRequest>这个入站事件没有被执行,而是直接执行的最后一个inboudhandlerWebSocketFrameHandler <WebSocketFrame>,这是为什么,是根据入站方法的<WebSocketFrame>判断的吗?所以跳过了上一个入站事件,那平常我写的时候应该怎么判断入站事件使用的什么类型数据?

###

ok,我明白了
在netty源码中,当EventLoopGroup中的EventLoop执行具体的Handler时
image.png
会执行这一行代码,因为我们的ChannelInitializer添加了多个handler,所以会依次执行,为什么问题中的WebSocketIndexPageHandler <FullHttpRequest>没有被执行,确实是因为类型不匹配
我写一个简单的泛型测试类
image.png
IDE会提示类型错误,那么netty在执行的时候自然也是执行不了的,但是这个WebSocketIndexPageHandler <FullHttpRequest>是被获取并且尝试执行的,debug的时候可以看到netty获取到了这个类


版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 使用箭头函数return数据不能实现

    使用箭头函数return数据不能实现

  • 个人小程序号能接入小程序3D地图吗?

    个人小程序号能接入小程序3D地图吗?

  • vue 移动端项目中,使用了better-scrol

    vue 移动端项目中,使用了better-scrol

  • css如何做出区域平均划分为四列

    css如何做出区域平均划分为四列

腾讯云代理商
海外云服务器