带有java.io的非阻塞服务器

Jon*_*Jon 2 java sockets io

大家都知道java IO是阻塞的,java NIO是非阻塞的.在IO中,您必须使用每个客户端模式的线程,在NIO中,您可以为所有客户端使用一个线程.

现在我的问题如下:是否可以使用Java IO api 进行非阻塞设计.(不是NIO)

我在考虑这样的模式(显然非常简化);

        List<Socket> li;
        for (Socket s : li) {
            InputStream in = s.getInputStream();
            byte[] data = in.available();
            in.read(data);
            // processData(data); (decoding packets, encoding outgoing packets
        }
Run Code Online (Sandbox Code Playgroud)

另请注意,客户端将始终准备好读取数据.

你对此有何看法?这是否适用于至少应该容纳几百个客户端而没有重大性能问题的服务器?

use*_*421 5

这是可能但毫无意义.在java.net中没有select(),所以你减少了轮询套接字,这意味着在民意调查之间休息,你不知道要睡多长时间,所以你将睡眠时间超过必要的时间,所以你会浪费时间,增加延迟等; 否则你必须以愚蠢的短间隔睡觉,因此消耗毫无意义的CPU.

对于仅仅几百个客户端,没有可能反对每个连接的传统线程使用.

我不知道"客户端总是准备好读取数据"的意思.您无法从服务器上判断出来,如果它没有准备好,写入它可能会阻止,这将完全扰乱您的applecard.

  • +1和`available()`在各个平台上看起来很奇怪.尝试这个IMHO的最好方法是使用超时(SO_TIMEOUT socket opt)轮询每个套接字,这再次......根本不会比每个线程解决方案的单个连接更好. (2认同)