将InputStream(阻塞)的内容写入非阻塞套接字

时间:2011-04-05 07:38:07

标签: java inputstream nio

我正在编写一个简单的Java NIO服务器并且有点头疼:我得到正常InputStream我需要管道到我的客户端。我有一个线程执行所有写操作,因此这会产生一个问题:如果InputStream阻止,所有其他连接写入将被暂停。

我可以使用InputStream.available()来检查是否有任何传入数据我可以无阻塞地读取,但是如果我已经到达流末尾,那么我必须调用{{ 1}}要知道。

这给我带来了很大的麻烦,但我不可能相信我是第一个遇到这个问题的人。

到目前为止,我提出的唯一选择是:

  • 为每个read()创建一个单独的线程,但这只是愚蠢的,因为我首先使用的是非阻塞I / O.我也可以让一个线程池执行此操作,但是再次限制了我可以将InputStream传送到的同时客户端的数量。
  • 有一个单独的线程读取这些流超时(如果读取持续时间超过一定的时间,则使用另一个线程中断),但是如果我有很多打开的话,这肯定会阻塞数据流{{1没有提供数据。

当然,如果有一个魔法InputStreamInputStream那么这根本不会有任何问题:'(

2 个答案:

答案 0 :(得分:3)

.....为每个InputStream都有一个单独的线程,但这只是愚蠢的,因为我首先使用非阻塞I / O ....

这根本不是愚蠢的。首先,您需要检查是否可以从InputStream实现中检索SelectableChannel。如果确实如此,你很幸运,你可以用选择器注册它并像往常一样。但是很有可能你的InputStream可能有一个不是SelectableChannel的通道,在这种情况下“为每个InputStream创建一个单独的线程”是显而易见的事情,也许是正确的事情。

请注意,在SO中讨论了not able to get a SelectableChannel from an inputstream类似的问题。不幸的是你被困住了。

答案 1 :(得分:-1)

  

我有一个单一的线程执行所有   写入

您是否已经停下来考虑这是否是问题的一部分而不是解决方案的一部分?