Netty中基于连接的UDP协议

时间:2013-03-12 11:36:01

标签: java udp netty

我需要为现有协议创建客户端。我相信Netty可以做到相对简单,但可以通过一些入门帮助。

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

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

谢谢!

詹姆斯

1 个答案:

答案 0 :(得分: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:存储MessageFragments数组,直到收到所有序列。如果收到的邮件不按顺序,则假设中间件丢失并要求发件人再次发送(通过unique-id / sequence)
  • MessageReAssember:当收到所有MessageFragments时,这个人重新组合原始消息并将其传递给消息接收者。

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