当前位置: 首页 > 知识库问答 >
问题:

端口统一与持久通道

潘翊歌
2023-03-14

我正在尝试将端口统一示例改编为我的代码库。我认为我遇到的问题是,客户端之间的通道保持打开状态

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

我能够通过将统一处理程序留在管道中来解决这个问题,但是,每次嗅探器识别协议时,它都会添加协议处理程序。由于管道在通道的生命周期内是持久的,因此我一遍又一遍地添加相同的处理程序。这很容易解决,只需向通道添加属性即可避免将内容重新添加到管道。

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

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

更新:

将神奇字节的消耗移出统一器似乎是正确的方法,但仍然存在的问题(或似乎是)是,动态改变管道在netty 4中的工作方式与在netty 3中不同。

我的客户端协议在所有请求前加上一个字节序列来标识它。对于netty 3,我们简单地跳过了ChannelBuffer中的字节,删除了unifier并添加了适当的协议处理来服务于该请求。同样的事情发生在所有后续的请求上,并且非常成功。

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

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

更新2:我认为我现在看到的行为与我在后续主题中提到的内容有关:如何管理识别协议的前缀字节序列

共有1个答案

毋宪
2023-03-14

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

更新:

再次阅读此方案后,我认为您的问题是您的统一处理程序正在消耗“魔术字节”。它不应该。内蒂的例子没有。单引号处理程序应该只确定协议,安装corcet处理程序序列并退出。新的处理程序序列应看到第一个字节缓冲区保持不变,即不应使用任何字节。

 类似资料:
  • 我正试图使用Flink以流媒体的方式使用消息队列中的有界数据。数据格式如下: 可以使用事件ID确定消息的开始和结束。我想接收此类批次并将最新的(通过覆盖)批次存储在磁盘或内存中。我可以编写自定义窗口触发器来使用开始和结束标志提取事件,如下所示: 但是如何保持最新窗口的输出。一种方法是使用ProcessAllWindowFunction接收所有事件并手动将其写入磁盘,但这感觉像是一种黑客行为。我还研

  • 问题内容: 到目前为止,我的偏好是始终使用EntityManager 来处理插入和更新。但是我还注意到,合并会在更新/插入之前执行其他选择查询,以确保数据库中不存在记录。 现在,我正在一个需要对数据库进行大量(批量)插入的项目。从性能的角度来看,在我绝对知道我一直在创建要持久化的对象的新实例的情况下,使用持久化而不是合并有意义吗? 问题答案: 它不是用一个好主意时,就足够了- 做了很多更多的工作。

  • 问题内容: 有没有办法告诉交互式Python Shell在会话之间保留其执行命令的历史? 在会话运行时,执行完命令后,我可以向上箭头访问这些命令,我​​只是想知道是否存在某种方式可以保存一定数量的这些命令,直到下次使用Python Shell时。 这将非常有用,因为我发现自己在上次会话结束时使用的会话中重用了命令。 问题答案: 当然可以,只需一个小的启动脚本。从交互式输入编辑及历史替换在Pytho

  • 主要内容:1 数据持久化,2 RDB(Redis DataBase)快照,2.1 RDB的原理,2.1 RDB的优缺点,2 AOF(append-only file)追加,2.1 AOF的原理,2.2 AOF重写,2.3 AOF的优缺点,3 混合持久化策略详细介绍了Redis的持久化机制,包括RDB与AOF持久化,以及混合持久化。 1 数据持久化 为了重启机器、机器故障、系统故障之后恢复数据,将内存中的数据写入到硬盘里面,这就是持久化,Redis恰好支持数据的持久化,这也是相比于Memcache

  • 到目前为止,我们已经构建了一个有工作量证明机制的区块链。有了工作量证明,挖矿也就有了着落。虽然目前距离一个有着完整功能的区块链越来越近了,但是它仍然缺少了一些重要的特性。在今天的内容中,我们会将区块链持久化到一个数据库中,然后会提供一个简单的命令行接口,用来完成一些与区块链的交互操作。本质上,区块链是一个分布式数据库,不过,我们暂时先忽略 “分布式” 这个部分,仅专注于 “存储” 这一点。 选择数

  • 问题内容: JPA中的和批注有什么区别?它们可以一起使用吗? 如果 他们可以一起使用吗?还是其中之一就足够了? 问题答案: 表示要保留属性,并且要使用标准映射。它具有允许您指定是否要延迟加载属性以及该属性是否为空的参数。 允许您指定数据库中属性要保留到的列的名称。 如果您指定一个不带另一个,那么您将获得明智的默认行为,因此,除了特殊情况外,通常人们只使用一个。 因此,如果我们想要延迟加载属性并指定