Java 用于低级别UDP消息传递系统的ByteBuffers替代方案

Java 用于低级别UDP消息传递系统的ByteBuffers替代方案,java,nio,bytebuffer,Java,Nio,Bytebuffer,我正在为加密的P2P体系结构开发一个低级UDP消息层,如果有兴趣,您可以阅读更多有关它的信息 我构建了一个简洁的序列化框架,将POJO转换为紧凑的ByteBuffers,还构建了各种库,使使用对称和非对称加密变得相当轻松 我现在正在开发消息传递框架,它利用动态代理实现与GWT的RPC机制类似的功能 我的问题是,早期我决定让序列化机制读写ByteBuffers。我现在发现这有几个问题: 在序列化对象之前,您需要知道bytebuffer的最大大小 它们是可变的,因此容易出错 它们与Datagram

我正在为加密的P2P体系结构开发一个低级UDP消息层,如果有兴趣,您可以阅读更多有关它的信息

我构建了一个简洁的序列化框架,将POJO转换为紧凑的ByteBuffers,还构建了各种库,使使用对称和非对称加密变得相当轻松

我现在正在开发消息传递框架,它利用动态代理实现与GWT的RPC机制类似的功能

我的问题是,早期我决定让序列化机制读写ByteBuffers。我现在发现这有几个问题:

  • 在序列化对象之前,您需要知道bytebuffer的最大大小
  • 它们是可变的,因此容易出错
  • 它们与DatagramPacket并不特别兼容,而且DatagramChannel令人困惑

有人能提出在这个框架中实现序列化的替代方法吗?

可能值得一看——它可能适合您的需要,或者您也可以看看他们是如何在幕后完成工作的

顺便说一句,它们确实为TCP和UDP连接使用ByteBuffers。我认为诀窍是从ByteBuffers中抽象出来,这样任何客户端代码都可以使用POJO。要做到这一点,您显然需要在某个地方有逻辑,可以将一个大对象分解为多个缓冲写入

我认为您实际上仍然希望使用ByteBuffers,因为它们速度非常快,支持各种本机加速技巧,而且不管您喜欢与否,最终都需要在高吞吐量IO环境中处理缓冲

有人能提出在这个框架中实现序列化的替代方法吗

在这里,我要谈谈您主要关心的问题:

  • 在序列化对象之前,您需要知道bytebuffer的最大大小
为什么ByteBuffer的最大尺寸?您可以使用缓冲池。您应该准备好将对象拆分为多个数据包。一个数据包-一个对象不适用于较大的对象。 序列化是一个有趣的想法:通常这就是它变得混乱的地方。您需要一些体面的协议层(+-重新发送数据包等)

  • 它们是可变的,因此容易出错
出于性能原因,您确实希望它们是可变的。我从来没有对它们的易变性有过异议。您可能还需要直接缓冲区。谢天谢地,它们变异了,因为它们的分配成本不低。直接缓冲区直接映射到操作系统代码中(查看sun.nio.ch.DatagramDispatcher)

  • 它们与DatagramPacket并不特别兼容,而且DatagramChannel令人困惑

它们很好,您只需要将对象拆分为多个数据包。如果您使用缓冲区,请坚持使用缓冲区,这应该很好。

哦,如果您对这个项目感兴趣,我需要可靠的Java程序员的帮助,请联系。是的,我看过Kryonet,但我认为它不支持我需要的那种低级加密,所以我必须自己开发。嗯,很棘手。总是有可能把加密层合并成kryonet作为某种扩展?否则,听起来你将要重新发明很多轮子……有时,重新发明轮子的唯一替代方法是将一个方形的钉子敲入一个圆孔(耶,混合隐喻!;)一般来说,在使用UDP时,你需要调整对象的大小,以确保能够装入单个数据包。UDP不能保证交付或顺序,因此您必须在设计时牢记这些限制。也就是说,它适用于传输频繁更新的数据(即游戏中的实体转换)或与尽力而为的更新(即P2P交换中的块)配合良好的数据。@Jolly,即使对于游戏,您也需要发送大小可能超过兆字节的初始状态,因此它不适合单个UDP数据包,然后需要(N)ACK等等。当然,UDP有它的局限性,没有任何保证,所以选择它而不是TCP应该是合理的。