【发布时间】:2011-04-05 07:38:06
【问题描述】:
我正在编写一个简单的 Java NIO 服务器并且有点头疼:我得到了正常的InputStreams 我需要通过管道传递给我的客户。我有一个线程执行所有写入,所以这会产生一个问题:如果 InputStream 阻塞,所有其他连接写入将被暂停。
我可以使用InputStream.available() 来检查是否有任何传入数据我可以在不阻塞的情况下读取,但如果我已经到达流尾,我似乎必须调用read()知道。
这让我很头疼,但我不敢相信我是第一个遇到这个问题的人。
目前为止我想到的唯一选择:
- 为每个
InputStream设置一个单独的线程,但这很愚蠢,因为我首先使用的是非阻塞 I/O。我也可以有一个线程池来执行此操作,但这又限制了我可以将InputStream传送到的同时客户端的数量。 - 有一个单独的线程在超时的情况下读取这些流(如果读取持续时间超过一定时间,则使用另一个线程中断),但是如果我有很多打开的
InputStream,那肯定会阻塞数据流不提供数据。
当然,如果有魔法InputStream.isEof() 或isClosed() 那么这根本不是问题:'(
【问题讨论】:
-
使用阻塞IO一点也不傻。您可以使用它获得相同或更好的性能。你知道这实际上是一个问题吗?
-
是的,服务器需要支持大量的持久连接(20,000+)。
-
您不能以非阻塞方式使用 InputStream,也无法解决这个问题。我建议您更换为您提供 InputStream 的系统或像您所做的那样使用多个线程。这些线程可以有多少个?如果它小于 1K,我不会担心。
-
如果您的连接数超过 10K,您是否考虑过使用多个服务器?
-
当然可以使用多个服务器,但我需要更多的编码,因为一些连接通过服务器相互通信。当然,没有什么是不可能的,但我宁愿不重写整个事情:)——而且我的预算有限。
标签: java inputstream nio