Websocket 如何确定网状通道管道中的动作顺序

Websocket 如何确定网状通道管道中的动作顺序,websocket,netty,pipeline,Websocket,Netty,Pipeline,例如,如果我想构建一个websocket服务器,我想知道应该在initChannel方法中放置什么。然后我在netty的源代码中找到了websocket示例,我需要在其中执行以下操作: public void initChannel(final SocketChannel ch) throws Exception { ch.pipeline().addLast( new HttpRequestDecoder(),

例如,如果我想构建一个websocket服务器,我想知道应该在
initChannel
方法中放置什么。然后我在netty的源代码中找到了websocket示例,我需要在其中执行以下操作:

public void initChannel(final SocketChannel ch) throws Exception {
                ch.pipeline().addLast(
                    new HttpRequestDecoder(),
                    new HttpObjectAggregator(65536),
                    new HttpResponseEncoder(),
                    new WebSocketServerProtocolHandler("/websocket"),
                    new CustomTextFrameHandler());
            }
但是我不知道为什么我需要把这些东西按这样的顺序排列。在
HttpObjectAggregator
的描述中,我发现如下内容:

请注意,{@link ChannelPipeline}中的{@link HttpObjectAggregator}之前需要有{@link HttpResponseEncoder}或{@link HttpRequestEncoder}。


但是在上面的代码中,
HttpObjectAggregator
对象在
HttpResponseEncoder
对象之前。我很困惑。我如何知道我正在以正确的顺序放置这些对象?

TLDR;您应该将
HttpServerCodec
放入init方法中,以保持简单。如果选择使用聚合器,请在
HttpObjectAggregator
之前执行此操作

我很确定关于在HttpObjectAggregator之前放置编码器的建议是错误的。编码器是仅出站处理程序,而HttpObjectAggregator是仅入站处理程序,这意味着事件永远不会与它们两者交互;因此,它们的相对顺序是否重要是毫无意义的

这里需要注意的是,在某些情况下,HttpObjectAggregator会将HttpObjects写出来(主要是一个100 CONTINUE),要将该HttpObject转换为可以通过线路发送的字节[],它需要一个HttpResponseEncoder,然后才能进入管道。在传出时,管道被反向遍历,因此在它之前的编码器将接收聚合器发送的消息,但在它之后的编码器不会。您发布的示例代码中有一个bug,只有在需要发送100个CONTINUE时才会出现。在聚合器之前,用HttpServerCodec替换编码器/解码器似乎修复了该错误

解码器,如HttpRequestDecoder或HttpResponseDecoder,是一个入站的唯一处理程序,它们必须在HttpObjectAggregator之前才能正常工作。这是因为这两个解码器将
byte[]
转换为
HttpObject
,而HttpObjectAggregator实际上是一个消息到消息的解码器,它将
HttpObject
转换为
FullHttpMessage

Netty介绍了HttpServerCodec,它是HttpRequestDecoder和HttpResponseEncoder在一个类中的组合。如果您将其放在聚合器之前,您将为自己保存一行代码,并确保您的服务器具有适当的编码器和解码器

了解消息在入站与出站处理程序的管道中如何工作的良好参考:

首次使用此措辞的问题(请注意,未提及编码,仅提及解码):


该措辞被指出为打字错误的问题:

TLDR;您应该将
HttpServerCodec
放入init方法中,以保持简单。如果选择使用聚合器,请在
HttpObjectAggregator
之前执行此操作

我很确定关于在HttpObjectAggregator之前放置编码器的建议是错误的。编码器是仅出站处理程序,而HttpObjectAggregator是仅入站处理程序,这意味着事件永远不会与它们两者交互;因此,它们的相对顺序是否重要是毫无意义的

这里需要注意的是,在某些情况下,HttpObjectAggregator会将HttpObjects写出来(主要是一个100 CONTINUE),要将该HttpObject转换为可以通过线路发送的字节[],它需要一个HttpResponseEncoder,然后才能进入管道。在传出时,管道被反向遍历,因此在它之前的编码器将接收聚合器发送的消息,但在它之后的编码器不会。您发布的示例代码中有一个bug,只有在需要发送100个CONTINUE时才会出现。在聚合器之前,用HttpServerCodec替换编码器/解码器似乎修复了该错误

解码器,如HttpRequestDecoder或HttpResponseDecoder,是一个入站的唯一处理程序,它们必须在HttpObjectAggregator之前才能正常工作。这是因为这两个解码器将
byte[]
转换为
HttpObject
,而HttpObjectAggregator实际上是一个消息到消息的解码器,它将
HttpObject
转换为
FullHttpMessage

Netty介绍了HttpServerCodec,它是HttpRequestDecoder和HttpResponseEncoder在一个类中的组合。如果您将其放在聚合器之前,您将为自己保存一行代码,并确保您的服务器具有适当的编码器和解码器

了解消息在入站与出站处理程序的管道中如何工作的良好参考:

首次使用此措辞的问题(请注意,未提及编码,仅提及解码):


这句话被指出是打字错误的地方:

Wow我不知道关于这个主题的这么多细节。只看单据是不够的,还要看出库单。除了阅读代码,还有什么更好的方法可以更快地学习Netty吗?正如你所看到的,如果幸运的话,我在一周后从stackoverflow那里得到了我问题的答案。哇,我不知道关于这个主题的这么多细节。只看单据是不够的,还要看出库单。除了阅读代码,还有什么更好的方法可以更快地学习Netty吗?如你所见,如果幸运的话,我会在一周后从stackoverflow那里得到我问题的答案。