[英]Write contents of an InputStream (blocking) to a non-blocking socket
我正在编写一个简单的Java NIO服务器并且有点头疼:我得到普通的InputStream
需要管道到我的客户端。 other connection writing will be paused. 我有一个线程执行所有写操作,因此这会产生一个问题:如果InputStream
阻塞, 其他连接写入将被暂停。
call read()
to know. 我可以使用InputStream.available()
来检查是否有任何传入的数据我可以无阻塞地读取,但如果我已经到达流末尾,我似乎调用read()
才能知道。
这给我带来了很大的麻烦,但我不可能相信我是第一个遇到这个问题的人。
到目前为止我提出的唯一选择:
InputStream
都有一个单独的线程,但这只是愚蠢的,因为我首先使用的是非阻塞I / O. 我也可以让一个线程池执行此操作但是再次限制了我可以将InputStream
传递给的并发客户端的数量。 InputStream
不提供数据,那么这肯定会阻塞数据流。 当然,如果有一个神奇的InputStream.isEof()
或isClosed()
那么这根本不会有任何问题:'(
“ .....每个InputStream都有一个单独的线程,但是这很愚蠢,因为我首先使用非阻塞I / O ...... ”
这根本不是愚蠢的。 首先,您需要检查是否可以从InputStream实现中检索SelectableChannel。 如果确实如此,你很幸运,你可以用选择器注册它并像往常一样。 但是很有可能你的InputStream可能有一个不是SelectableChannel的通道,在这种情况下“为每个InputStream创建一个单独的线程”是显而易见的事情,可能是正确的事情。
请注意,在SO中讨论的类似问题是无法从输入流获取SelectableChannel 。 不幸的是你被困住了。
我有一个执行所有写操作的线程
你有没有停下来考虑这是否是问题的一部分而不是解决方案的一部分?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.