java - 无法为我的 Java 应用程序选择正确的网络解决方案

标签 java network-programming

我正在编写一个分布式 Java 应用程序,该应用程序将大量使用网络,并且需要快速

假设我有一个名为 Widget 的类。小部件是在客户端(最有可能是 Swing box)创建的,但需要在服务器端保留并在所有其他连接的客户端之间共享/分发。因此,我需要一种方法来序列化 Widget 实例,将它们发送到服务器,服务器将在其中管理它们并使用它们感兴趣的 Widget 中的状态更改来更新所有连接的客户端。(因此,一旦创建了 Widget 并将其发送到服务器-side,理论上它可以被任何其他客户端“拉下来”并修改。

性能是必须的,所以这必须是一个二进制协议(protocol)。还更喜欢非阻塞套接字,以及非常非常可扩展的东西。

所以我将 RMI、NIO 和 Netty 视为可行的解决方案。如果我正确理解 Java 网络,那么一切似乎都表明 RMI 比 NIO 慢得多。我还听说 RMI 缺乏可扩展性。另一方面,NIO 为您提供了更大的灵 active ,因此要复杂得多。 Netty 似乎拥有最好的文档,但似乎比 NIO 慢,并且可能无法完成我真正需要它做的事情。

对于 Widget 分发,我只是在寻找通过网络快速发送 Widget 的能力。不关心使用什么协议(protocol)。

有人愿意分享他们的想法/意见吗?

谢谢!

最佳答案

首先,RMI 和 NIO 是同类的;所以不要混淆那些不是替代品的东西。其次,确保性能确实很重要;以及什么样的性能(吞吐量和延迟通常是首选;或者可能是空间效率)。您有可能高估了性能的重要性,因为使用好的解决方案,您更有可能受到网络性能的限制,而不是端点 (CPU) 性能的限制。

如果性能很重要,请查看 jvm-serializers以获得实际格式的性能比较。例如,Java 序列化用于 RMI。

哦,顺便说一句,不要假设您必须使用二进制格式。这通常不是一个硬性要求;文本格式可以很好地压缩,并且更容易调试/故障排除,并在需要时由其他平台、语言进行处理。

关于java - 无法为我的 Java 应用程序选择正确的网络解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4798866/

相关文章:

java - 为什么我的扫描仪要求输入两次?

java.lang.ClassNotFoundException 太阳.misc.GC

c# - 是否可以重置 ServicePointManager?

c++ - Socket::close() 和 StreamSocket::shutdown() 之间的区别

java - Java 中删除 ArrayList 中的相同值

java - 对角处理二维数组

java - Spring MVC 4与mvc :resources not working

java - Java 开发人员的 IPv6 准备情况

java - 为什么 HTTPURLConnection.getInputStream() 需要时间

Qt Stream 网络摄像机视频