什么是在Java中将UDP和RPC组合的最简单有效的方法?

4

我目前正在考虑在我的项目中使用Java(与网络无关的原因)。目前我正在使用C++和基于UDP的自定义协议。我的问题是,虽然增加效率对于发送大量实时数据很好,但我更希望在纯“逻辑操作”(例如登录)方面使用类似RPC的东西。但在C++中使用RPC很难,因为标准C++本身没有序列化概念。

在另一个答案中,我发现了Java的RMI,它似乎类似于RPC,但我找不到它的效率/响应速度如何,也不知道是否可以插入到我现有的UDP套接字中,因为我不想在我的服务器程序上打开两个端口。

或者,由于我认为Java具有序列化功能,我可以自己实现RPC,这取决于在Java中解串行化任意对象流的简易程度。但如果这需要我花费数天时间学习Java的内部机制,那对我来说就不是一个选项。


这对于除了我的好奇心之外的任何事情都没有影响,但是你使用了什么自定义UDP协议?你是自己编写的,还是使用类似UDT(udt.sourceforge.net)的东西? - Thomas Owens
这是我自己在UDP之上构建的协议。它添加了一些TCP功能,确切地说,它确保消息完整性,重新请求丢失的数据包,并允许消息处理程序在运行时可选地强制执行数据包排序。它专门为游戏而构建。据我所知,UDT专注于不同的领域,但是C#的lidgren库似乎类似于我所开发的协议。 - cib
这非常有趣。谢谢。 - Thomas Owens
3个回答

2
如果您对RPC感兴趣,可以使用XML-RPCJSON-RPC,两者都有免费/开源的C++实现。不幸的是,我的大部分开发工作都是在Java中完成的,所以我无法评价它们的可用性或有效性,但这可能是值得研究的事情,因为您似乎已经在C++上做了一些工作并且对它很熟悉。它们也有Java实现,因此您甚至可以使用XML-RPC或JSON-RPC同时支持Java和C++应用程序,如果您想走这条路线的话。
唯一的缺点是它们似乎大多使用HTTP连接。您想要做的事情之一就是重用现有的连接。现在,我没有查看所有的实现,但我查看的两个可能不能满足该要求。最坏的情况是,也许您可以得到一些想法。最好的情况是,也许有另一个实现能够满足您的需求,而您现在有了一个起点来找到它。

1
使用RPC作为一种抽象并不排除使用UDP作为传输层:RMI是一种RPC抽象,通常在后台使用TCP(上次我查看时如此)。
我建议只需编写一个Java层来处理您的UDP协议:您可以使用许多库之一来完成此操作,而无需放弃所有现有工作。如果您想在协议周围包装一个RPC层,没有理由不能这样做:创建一个“登录”方法,该方法发送登录UDP数据包并接收适当的响应并将其返回。

听起来是个好主意,但我没有Java的经验,似乎找不到正确的文档/库。你能指导我学习更多的资源吗? - cib

0
如果这是一个比较严肃的项目,你应该看一下Netty
它是一个非常好的用于开发网络系统的库,已经在很多生产环境中得到了验证,并且非常适合TCP或UDP客户端-服务器通信等方面。除非你真的必须这样做,否则不要重新发明轮子 :-)
作为额外的奖励,他们还有一些很好的示例和文档。

这个库看起来很有趣,但我找不到任何关于RPC的提及。此外,我只需要两种“编码”,二进制和序列化对象,因此完整的解码/编码管道对我来说似乎过于复杂了。 - cib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接