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

标签 java inputstream nio

我正在编写一个简单的 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/

相关文章:

java - 按长度分割字符串,保持子字符串完整

java - 将转换后的 Canvas DataURL 字节保存到数据库时出现 Blob 损坏

java - InputStream 不会重置为开始

java - 基于java NIO的TFTP客户端

java - Java 中的 SocketChannel 发送数据,但没有到达目标应用程序

Java NIO - 使用选择器

java - 实现迭代器时索引不递增

java - 如何通过网络将鼠标/键盘输入发送到另一个对等点?

java - 如何重命名 Spring MVC Web App 上下文根?

android - 从 assets 文件夹加载大于 1M 的文件