java.net 与 java.nio

Posted

技术标签:

【中文标题】java.net 与 java.nio【英文标题】:java.net versus java.nio 【发布时间】:2010-09-21 00:07:48 【问题描述】:

什么时候从 java.net 切换到 java.nio 更好? .net(不是 Microsoft 实体)更易于理解和熟悉,而 nio 具有可扩展性,并带有一些额外的漂亮功能。

具体来说,我需要针对这种情况做出选择:我们有一个控制中心管理多个远程站点的硬件(每个站点都有一台计算机管理多个硬件单元(收发器、TNC 和旋转器))。我的想法是在每台机器上编写一个服务器应用程序,作为从控制中心到无线电硬件的网关,每个单元都有一个插座。根据我的理解,NIO 是针对一台服务器,多台客户端,但我想的是一台客户端,多台服务器。

我想第三种选择是使用 MINA,但我不确定这是否会在一个简单的问题上投入过多。


每台远程服务器最多有 8 个连接,都来自同一个客户端(用于控制所有硬件,以及单独的 TX/RX 套接字)。但是,单个客户端将希望同时连接到多个服务器。与其将每个服务器放在不同的端口上,是否可以在客户端使用通道选择器,还是在客户端使用多线程 io 并以不同方式配置服务器更好?


实际上,由于远程机器仅用于与其他硬件交互,RMI 或 IDL/CORBA 会是更好的解决方案吗?真的,我只是希望能够从硬件发送命令和接收遥测数据,而不需要编写一些应用层协议来完成。

【问题讨论】:

【参考方案1】:

避免使用 NIO,除非您有充分的理由使用它。 It's not much fun and may not be as beneficial as you would think。一旦处理了数万个连接,您可能会获得更好的可扩展性,但在较低的数量下,您可能会通过阻塞 IO 获得更好的吞吐量。不过,与往常一样,在做出您可能会后悔的事情之前,请自行衡量。

还有一点需要考虑的是,如果你想使用 SSL,NIO 会非常痛苦。

【讨论】:

感谢您对 SSL 的评论,这可能会促使我做出决定。 进展顺利,因为我确信您在 2012 年 2 月在 java 1.4 上运行【参考方案2】:

可扩展性可能会推动您选择软件包。 java.net 每个套接字需要一个线程。编码它会容易得多。 java.nio 效率更高,但编写代码可能很麻烦。

我会问自己,您希望处理多少个连接。如果它相对较少(例如,

【讨论】:

使用现代 64 位操作系统,您可以拥有数十万个线程。 当然,但这不一定是构建应用程序的最具可扩展性的方式。 问题不是更多的套接字与更多的线程之一。每个套接字有多少个线程。 @Zombies 在什么意义上?除了一个线程花费半兆字节和一个套接字花费几十千字节这一事实之外,它们几乎没有可比性。【参考方案3】:

现在几乎没有理由从头开始编写这种网络代码。 netty.io 之类的软件包几乎总能以比手工解决方案更少的代码行数为您提供更可靠、更灵活的代码。此外,使用 Netty,您可以获得 SSL 支持,而不会使您的实施复杂化。像 netty 这样的库也几乎完全消除了“异步与线程”的问题,为您提供了良好的性能,并且仍然允许您根据需要调整线程模型。

【讨论】:

【参考方案4】:

你所说的连接数告诉我你应该使用 java.net。确实,没有理由使用非阻塞 I/O 来复杂化您的任务。 (除非您的远程系统功能不足,但是为什么要在它们上使用 Java?)

看看Apache's XML-RPC 包。它易于使用,对您完全隐藏网络内容,并且可以通过良好的 HTTP 运行。无需担心协议问题......这一切看起来都像是对你的方法调用,在两端。

【讨论】:

XML-RPC 看起来很有趣,但我使用的是 SE,我认为添加/切换到 EE 甚至比 NIO 复杂得多,但如果我错了,请纠正我(它们是否运行同一个JVM?)。 这是一个简单的库,应该可以在 SE 和 EE 中工作。就像另一位评论员提到的那样,它确实存在可扩展性问题。但对于 98% 的情况,我认为它非常可靠。【参考方案5】:

鉴于所涉及的连接数量很少,java.net 听起来是正确的解决方案。

其他张贴者谈到了使用 XML-RPC。如果要传送的数据量很小,这是一个不错的选择,但是在编写传送大量数据的进程间通信(例如,大请求/响应,或频繁的少量数据)。 XML 解析的成本通常比更优化的有线格式(例如 ASN.1)高几个数量级。

对于低容量控制应用程序,XML-RPC 的简单性应该超过性能成本。对于大容量数据通信,最好使用更高效的有线协议。

【讨论】:

以上是关于java.net 与 java.nio的主要内容,如果未能解决你的问题,请参考以下文章

关于 .NET 与 JAVA 在 JIT 编译上的一些差异

java 11 java.net.http.Websocket 与 undertow 或 vert.x、netty 相比效率如何

关于 .NET 与 JAVA 在 JIT 编译上的一些差异

java.lang.ClassLoader与java.net.URLClassLoader学习

UDP 发送与接收数据

Java - net.sf.json 之 putaccumulateelement 实践与疑问