每个人都知道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
}
另请注意,客户端始终可以读取数据。
您对此有何看法?这是否适用于至少应该容纳几百个客户端且没有重大性能问题的服务器?
答案 0 :(得分:5)
有可能但毫无意义。在java.net中没有select(),所以你减少了轮询套接字,这意味着在民意调查之间休息,你不知道要睡多长时间,所以你将睡眠时间超过必要的时间,所以你将浪费时间,增加延迟等;否则你必须以愚蠢的短间隔睡觉,因此消耗毫无意义的CPU。
对于仅有几百个客户端,不存在对每个连接的传统线程使用的反对意见。
我不知道'客户端总是准备好读取数据'意味着什么。您无法从服务器上判断出来,如果它没有准备好,写入它可能会阻止,这将完全扰乱您的applecard。