Java客户端/服务器通信的标准

7
什么是用于客户端/服务器或P2P通信的“官方”Java API? Java RMI?其他一些网络API?这个“官方网络API”是SE和EE的标准吗?
我相信答案非常具体化,所以让我们看一下几个实例:
1.您在两台安装了2个Swing客户端的计算机上,并连接到同一网络(或Internet),您希望其中任何一个将原始数据(例如整数4)或某些POJO(如“Widget”对象)发送给另一个客户端。
2.与上面相同,但是在Swing客户端和完全符合Java EE后端之间进行通信(实现托管bean、应用程序服务器等)。
我没有具体的应用程序想法,我只是想知道在Java世界中,客户端-客户端和客户端-服务器通信的“规范”是什么。
5个回答

3
如果受 Java 绑定不成问题,RMI 在客户端和服务器解决方案“交换”数据时是一个非常抽象的解决方案(特别是当数据是 Java 类时可能很难/需要大量努力来表示为文本数据)。只需确保您的对象实现了 Serializable 接口,几乎任何东西都可以通过网络传输。
如果这不符合您的要求,并且您想要降低原始网络通信的复杂性,客户端-服务器套接字框架 Netty 是一个相当不错的选择。

Netty对象和序列化的RMI对象使用哪些协议进行传输?TCP协议栈?UDP?还是其他协议?如何加密它们的内容?SSL?AES?还是更强的加密方式? - Zac

1

在J2SE中,不存在所谓的“最正式”的网络API,所有J2SE API都是官方的,因为它们得到了Sun(现在是Oracle)的支持。

话虽如此,您应该根据以下标准选择API:

  • 您(或您的团队)是否知道如何使用特定的API;
  • 这个API使用起来有多简单/复杂;
  • 您的吞吐量目标是什么?对于性能敏感的应用程序,您可能被迫使用二进制协议。对于其他情况,您可以使用基于文本的协议。

例如,在两个客户端之间,简单的基于文本的协议就足以传递POJOs,例如使用Apache MINA或Google协议缓冲区。
这也适用于客户端和服务器之间的通信。


回复 Zac 在评论中的问题:

  1. 二进制协议的性能提升来自于您不需要将所有内容转换为文本形式,然后再转换回来 - 您只需传递应用程序内存的二进制表示,并进行最小更改,例如在 BSD Sockets API 的情况下,从主机字节顺序转换为网络字节顺序。不幸的是,我不知道 RMI/Java 序列化如何处理对象的详细信息,但我相信它仍然比以可读形式传递所有数据要快得多;
  2. 是的,MINA 和协议缓冲区都有 Java API。它们只是不属于 Java SE 捆绑包,您必须单独下载它们。顺便说一下,MINA 可以使用二进制和可读序列化,具体取决于您如何使用它。
  3. 您应该以某种方式定义“好”的概念,例如回答我上面提到的问题。如果您想在网络上使用对象,请使用 RMI。如果您不想使用对象,则 Netty 或 MINA 就足够了,无论哪个您觉得更容易掌握。

1
请注意:J2SE 已经不再使用,已经超过 5 年被称为 Java SE。参考链接:http://www.java.net/blog/kgh/archive/2005/06/goodbye_j2se_he_1.html - Sean Patrick Floyd
谢谢!还有几个后续问题:(1)在二进制协议中,如何将POJO和原始类型编译/序列化/等等成二进制,使它们比基于文本的替代方案快得多?(2)MINA和Google协议:它们有Java API,对吗?(3)有哪些好的二进制协议?RMI?Netty?其他? - Zac

0

对于P2P,Sun曾经非常推崇JXTA

我不敢使用RMI进行P2P通信。


0

rmi 是标准的 Java 到 Java 协议。它被内置在 Java 中,并且非常简单易用。大多数 J2EE 后端也使用 rmi 进行通信,但这并不是唯一的选择。


-1

J2SE中最常见的可能是RMI或原始套接字。

J2EE使用一个消息总线,所有人(服务器和客户端)都订阅它,这与rmi风格的解决方案非常不同(虽然在最低层次上,实现仍可能依赖于RMI)。它有助于自动化冗余和故障转移。如果您需要此功能,我相信它也可以在SE中使用。

我已经很长时间没有使用J2EE了,所以这可能已经改变了,但我怀疑它。消息系统是J2EE的核心组件。


JSE肯定使用RMI。然而,我不确定您从何得到有关J2EE消息总线的想法。在J2EE中,消息传递是可能的,但通常采用普通的远程方法调用,这些调用通常是通过RMI实现的。 - jtahlborn
@jtahlborn 多年来我都没有使用J2EE,但它对于系统(JMS)很重要。它肯定仍然列为J2EE的核心部分(http://download.oracle.com/javaee/6/tutorial/doc/bncdr.html),而且我不知道你如何在没有它的情况下实现任何真正的系统。使用RMI调用如何实现自动服务器故障转移?这将是很麻烦的。您确定您不只是使用J2EE的一些部分来实现单个Web服务器或类似的东西吗? - Bill K

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