2

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

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

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

        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
        }

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

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

4

1 回答 1

5

这是可能的,但毫无意义。java.net 中没有 select(),因此您只能轮询套接字,这意味着在轮询之间休眠,并且您无法确定要休眠多长时间,因此您会睡得比需要的时间更长,因此您将浪费时间,增加延迟等;否则你必须睡很短的时间间隔,因此消耗毫无意义的 CPU。

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

我不知道“客户端将始终准备好读取数据”是什么意思。你无法从服务器上看出这一点,如果它还没有准备好,写入它可能会阻塞,这会完全破坏你的苹果卡。

于 2012-12-04T22:18:29.290 回答