Netty 具有持久通道的端口统一

Netty 具有持久通道的端口统一,netty,Netty,我正试图使端口统一示例适应我的代码库。我认为我遇到的问题是,在服务器关闭或客户端完成任务之前,或者更具体地说,在整个过程中使用相同的管道之前,客户端和服务器之间的通道一直保持打开状态。因此,示例中从管道中删除unifier处理程序的工作流不起作用 我在端口统一示例中看到的问题是,我的客户机一直在对每个请求预挂起魔法字节,但服务器端通道删除了端口统一处理程序,这是在消息被确定为有效协议消息后传入的第一个请求。通道上的后续消息(包含来自客户端的前缀magic字节)无法处理,因为统一处理程序不再在管道

我正试图使端口统一示例适应我的代码库。我认为我遇到的问题是,在服务器关闭或客户端完成任务之前,或者更具体地说,在整个过程中使用相同的管道之前,客户端和服务器之间的通道一直保持打开状态。因此,示例中从管道中删除unifier处理程序的工作流不起作用

我在端口统一示例中看到的问题是,我的客户机一直在对每个请求预挂起魔法字节,但服务器端通道删除了端口统一处理程序,这是在消息被确定为有效协议消息后传入的第一个请求。通道上的后续消息(包含来自客户端的前缀magic字节)无法处理,因为统一处理程序不再在管道中使用magic字节,从而导致消息格式错误

我可以通过将统一处理程序留在管道中来解决这个问题,但是,每次嗅探器识别协议时,它都会添加协议处理程序。因为管道在通道的生命周期中是持久的,所以我不断地反复添加相同的处理程序。通过向通道添加一个属性来避免向管道中重新添加内容,这非常容易解决

现在我看到的问题是消息被分解成几个缓冲区。如果客户端发送的2k字节分为两条消息。第一条消息被正确地嗅探并传递到下一个处理程序(具体来说是LengthFieldBasedFrameDecoder)。它没有所有的字节,所以它等待其余的字节。当下一条消息包含其余字节时,因为我无法从管道中删除unifier,我再次嗅探,嗅探失败

有没有解决办法,或者更好的方法来完成同样的事情

更新:

将魔法字节的消耗移出unifier似乎是正确的方法,但仍然存在的问题(或似乎是)是动态更改管道在netty 4中的效果与在netty 3中的效果不同

我的客户机协议是在所有请求前加上字节序列来识别它。对于netty 3,我们只需跳过ChannelBuffer中的字节,删除unifier并添加适当的协议处理来服务该请求。随后的所有请求都发生了同样的情况,而且效果非常好

然而,对于netty 4,一旦我们从吃魔法字节的管道中删除了处理程序,它就会在通道的生命周期中消失,直到客户端关闭它为止。因此,在管道/通道HandlerContext似乎对通过通道的每条消息都是新的之前,它每次都被重复使用,我认为这就是问题所在

在AICT中,这使得管道的这种动态变化在实践中变得困难或不可能。我希望某个东西只消耗每个请求的前N个字节,但我不能将其留在管道中,因为分解成多个ByteBuf的大型请求都会吃掉它们的前N个字节,这会严重破坏它们


更新2:我认为我现在看到的行为与我在后续主题中提到的有关:

端口统一示例不希望客户端切换协议。如果您真的想支持这一点,那么必须为客户端提供一种机制,让客户端说:“我现在已经使用了这个特定的协议,下一条消息可能会使用不同的协议”,然后将PortUnificationServerHandler重新插入一个已清除的管道中

更新:


在再次阅读该场景之后,我认为您的问题在于统一处理程序正在消耗“魔法字节”。不应该。这个棘手的例子却没有。unifictaion处理程序应该只确定协议,安装correct处理程序序列并退出。新的处理程序序列应该看到第一个字节缓冲区没有改变,即没有消耗任何字节。

客户端没有切换协议。它只是通过通道发送第二条消息。它是一个异步RPC客户端服务器。第一个RPC交换b/w这两个都很好,第二个是失败的,要么是因为unifier不在管道中,要么是因为第二个请求太大,以至于它被分成了几个ByteBuf's。我应该指出,3.6.6中完全相同的设置工作得很好。我所做的就是将代码库迁移到netty4@Michael好的,但我就是这样解释这个场景的。很酷,我只是想澄清一下。我需要的是unifier处理程序每次读取只调用一次的能力;当来自客户端的消息被分解为多个ByteBuf时,就会出现问题。最初的示例只是删除了解决此问题的统一器,但如果计划重新使用通道,则无法做到这一点。我的用例似乎没有那么不寻常,所以很难相信那些讨厌的人没有解决这种情况的方法。你的建议,unifier没有删除魔法字节是有道理的,这是我的一个错误。但是必须删除这些字节,我不明白当请求被几个ByteBuf中断时如何才能完成。拥有一个将吃掉这两个字节的处理程序很容易,但让它只吃掉最初的两个字节似乎很棘手。