1

我需要为现有协议创建一个客户端。我相信 Netty 会让这变得相对简单,但可以做一些入门帮助。

该协议使用基于连接的方法,但在 UDP 之上分层,实际消息位于传输信封内,无序/慢/丢失数据包、会话编号等都是客户端的工作。

在netty中创建管道和帧解码器等以实现这一目标的最佳方法是什么。我以前只以非常基本的方式使用过netty - 所以任何建议都会非常受欢迎。

谢谢!

詹姆士

4

1 回答 1

2

听起来很痛苦。我是一个普通的netty用户,但我不会在Netty中实现这样的协议(不是反对netty,但它在其他地方实现),至少,你描述它的方式。在你走这条路之前,我会看一下JGroups,它实现了一个“可靠的 UDP”堆栈,它具有你概述的所有传输功能。

我的第一次尝试(如果我在荒岛上)会是这样的:

下游

sendMessage
  --> MessageSplitHandler
    --> MessageFragmentBufferHandler
RetransmitRequester -->

在哪里:

  • MessageSplitHandler 将发送的消息分解为 UDP 友好大小的 MessageFragments(数据报)(如果原始消息足够小,可能会有一个)。对于从父消息创建的每个 MessageFragment,分配每个:
    • 父消息的唯一 ID。
    • 序号
    • 从原始创建的片段总数
  • MessageFragmentBufferHandler 存储每个 MessageFragment,直到远程端确认已收到消息(或者您选择超时消息重组并丢弃未确认的消息)。否则,请保留它们以防远程请求 MessageFragment 重新传输(可能通过 parent-message-id 和片段序列。

上游的

这将或多或少与下游相反。

   MessageFragmentDecoder <--
  MessageFragmentBuffer <--
 MessageReAssember <--
onMessage
  • MessageFragmentDecoder:将数据报解码为MessageFragment。
  • MessageFragmentBuffer:存储 MessageFragment 数组,直到收到所有序列。如果消息被乱序接收,假设中间丢失并要求发送者再次发送它(通过唯一ID/序列)
  • MessageReAssember:当所有的MessageFragment都接收完毕后,这家伙重新组装原始消息,并传递给消息接收者。

我认为这是一般的想法,但那里可能有 200-300 个角落案例......

于 2013-03-12T14:48:10.333 回答