繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM