最近在学习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>判断的吗?所以跳过了上一个入站事件,那平常我写的时候应该怎么判断入站事件使用的什么类型数据?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…