java.net与java.nio

时间:2008-11-06 00:38:50

标签: java networking io nio

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

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

我认为第三种选择是使用MINA,但我不确定这是否会对一个简单的问题投入太多。


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


实际上,由于远程机器仅用于与其他硬件交互,RMI或IDL / CORBA是否是更好的解决方案?实际上,我只是希望能够从硬件发送命令并接收遥测,而不必编写一些应用程序层协议来执行此操作。

5 个答案:

答案 0 :(得分:11)

除非您有充分的理由使用它,否则请避免使用NIO。 It's not much fun and may not be as beneficial as you would think。处理成千上万的连接后,您可以获得更好的可扩展性,但是数量越少,阻塞IO的吞吐量就越高。一如既往,在做出你可能会后悔的事情之前,先进行自己的测量。

要考虑的其他事情是,如果你想使用SSL,NIO会让它非常痛苦。

答案 1 :(得分:10)

可扩展性可能会推动您选择的软件包。 java.net每个socket需要一个线程。编码将更加容易。 java.nio效率更高,但可以编写代码。

我会问自己,您希望处理多少个连接。如果它相对较少(比如说,< 100),我会选择java.net。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您正在谈论的连接数告诉我您应该使用java.net。实际上,没有理由将您的任务与非阻塞I / O进行复杂化。 (除非您的远程系统功能不足,但为什么要在它们上使用Java?)

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

答案 4 :(得分:0)

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

其他海报讨论了使用XML-RPC。如果发送的数据量很小,这是一个不错的选择,但是在编写发送大量数据的进程间通信时(例如大量请求/响应,或频繁的少量数据),我在使用基于XML的协议时遇到了不好的经验数据)。 XML解析的成本通常比更优化的有线格式(例如ASN.1)高几个数量级。

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