我正在编写一个简单的 Java NIO 服务器,但有点头疼:我得到了正常的 InputStream
,我需要将其通过管道传输到我的客户端。我有一个线程执行所有写入,因此这会产生一个问题:如果 InputStream
阻塞,所有 其他连接写入将被暂停。
我可以使用 InputStream.available()
来检查是否有任何传入数据我可以无阻塞地读取,但是如果我已经到达流的末尾,我似乎必须 调用 read()
即可知道。
这让我很头疼,但我不敢相信我是第一个遇到这个问题的人。
到目前为止我想到的唯一选择:
- 为每个
InputStream
设置一个单独的线程,但这很愚蠢,因为我首先使用的是非阻塞 I/O。我也可以有一个线程池来执行此操作,但这又限制了我可以通过管道将InputStream
传输到的同时客户端的数量。 - 有一个单独的线程读取这些流并超时(如果读取持续时间超过一定时间,则使用另一个线程中断),但如果我有很多打开的
,那肯定会阻塞数据流InputStream
未传送数据。
当然,如果有一个神奇的 InputStream.isEof()
或 isClosed()
那么这根本就不是问题:'(
最佳答案
“.....为每个 InputStream 设置一个单独的线程,但是这很愚蠢,因为我首先使用的是非阻塞 I/O....”
一点都不傻。首先,您需要检查是否可以从 InputStream 实现中检索 SelectableChannel。如果是,那么你很幸运,你可以用一个选择器注册它并像往常一样做。但是您的 InputStream 可能有一个不是 SelectableChannel 的 channel ,在这种情况下,“为每个 InputStream 设置一个单独的线程”是显而易见的事情,而且可能是正确的事情。
请注意,SO 中讨论了关于 not able to get a SelectableChannel from an inputstream 的类似问题。 .不幸的是你被困住了。
关于java - 将 InputStream 的内容(阻塞)写入非阻塞套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5548666/