Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于高性能服务器的Java NIO或Java IO_Java_Sockets_Io_Nio - Fatal编程技术网

用于高性能服务器的Java NIO或Java IO

用于高性能服务器的Java NIO或Java IO,java,sockets,io,nio,Java,Sockets,Io,Nio,对于我正在开发的服务器,我一直在努力选择JavaNIO还是旧的JavaI/o阻塞套接字 我认为JavaNIO会更好,因为它将有大量的客户机,客户机将保持连接,以便服务器可以在可用时推送数据 因此,这使我认为java阻塞i/o将是过度的,因为线程的数量将很高 对于这种情况,您的看法是什么?如果将单个消息推送到客户机需要很长时间,那么您只会遇到阻塞I/O的问题。仅仅连接客户端并不需要每个客户端有一个线程。事实上,我现在正在写这样一个软件。您只需要在特定时间点进行并发消息推送的线程数。这通常不会很高。

对于我正在开发的服务器,我一直在努力选择JavaNIO还是旧的JavaI/o阻塞套接字

我认为JavaNIO会更好,因为它将有大量的客户机,客户机将保持连接,以便服务器可以在可用时推送数据

因此,这使我认为java阻塞i/o将是过度的,因为线程的数量将很高


对于这种情况,您的看法是什么?

如果将单个消息推送到客户机需要很长时间,那么您只会遇到阻塞I/O的问题。仅仅连接客户端并不需要每个客户端有一个线程。事实上,我现在正在写这样一个软件。您只需要在特定时间点进行并发消息推送的线程数。这通常不会很高。考虑推送消息所需的时间与消息到达的等待时间的比率。将同时运行的客户端数乘以这个数,就得到了平均活动线程数

您将维护一组所有打开的输出流,每个客户端一个。它们将一直存储在内存中,直到需要推送到客户机的消息到达。此时,您将需要一个线程来处理该消息。如果在推送消息时,希望处理另一个事件并将消息推送到另一个客户机,则需要第二个线程,但第一次推送完成后,该线程将返回到可用线程池


我还可以建议使用actor模型实现来协调消息推送。actor模型与这个问题完全匹配。

您试过了吗?我会使用一个现有的框架——不要直接使用NIO,它是一个PITA,很难“纠正”——至少要为它使用一个像XNIO这样的包装器,尽管也许甚至更高级别的抽象都是一个开始(例如,Tomasz提到的消息框架或事件驱动服务器)。对我来说,NIO的一大优势与其说是“线程减少”,不如说是“并发减少”-也就是说,它要求我通过在线程之间设置一个交叉点来减少对并发性问题的考虑。您所说的高连接数是什么意思?每台服务器100、1000、10000或100000个。您的解决方案将取决于您的确切需求。如果没有更多详细信息,我会假设更简单的解决方案是最好的。