java - 如何正确使用ChunkedStream

标签 java netty

这是我的用例...我有一个上游服务,它通过网络发送我的 Netty 应用程序数据,并且该数据需要发布到连接到 Netty 的多个客户端。推送到客户端的数据必须是 HTTP“Transfer-Encoding: chunked”。

我找到了 ChunkedStream 并且也许我可以创建一个 PipedInputStream 和一个 PipedOutputStream(连接到 PipedInputStream) 并将 ChunkedStream 写入 channel 。然后,当从我的上游服务接收到数据时,我可以将数据写入 channel 的 PipedOutputStream 并将其发送给客户端:

在已连接的 channel 中

PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream(in);
ctx.getChannel().write( new PersistentChunkedStream(in) );

单独的线程将数据发布到连接的 channel

ChannelBuffer buff = ChannelBuffers.copiedBuffer("FOO",CharsetUtil.UTF_8);
out.write( buff.array() );
channel.get(ChunkedWriteHandler.class).resumeTransfer();

我必须扩展 ChunkedStream 以从 nextChunk 返回 null 如果有 0 个字节可用(“暂停”没有线程的写入挂起),所以我在写入关联 channel 的 PipedOutputStream 后调用 resumeTransfer。当我调试并逐步执行代码时,我可以看到正在调用 ChunkedWriteHandlerflush,它会调用:

Channels.write(ctx, writeFuture, chunk, currentEvent.getRemoteAddress());

我将字节写入 PipedOutputStream, 但客户端从未收到。

HTTP curl

~ $ curl -vN http://localhost:8080/stream
* About to connect() to localhost port 8080 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /stream HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3
> Host: localhost:8080
> Accept: */*
> 
< HTTP/1.1 200 OK
< Transfer-Encoding: chunked
< 
### NOTE: NO "FOO" TRANSMIT BACK ###

有什么想法吗?也许有更好的方法来实现这一目标?

最佳答案

我想知道您为什么还要使用 PipedInputStream/PipedOutputStream。我认为在没有数据的情况下直接调用 Channel.write(..) 会更干净/更容易。请注意在 Channel.write(..) 中提交尽可能多的数据,因为这是一项昂贵的操作。

您可以从任何您想要的线程调用 Channel.write(..),因为它是线程安全的。

关于java - 如何正确使用ChunkedStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9027322/

相关文章:

java - 如何监听子组件?

java - 如何从目录中访问文件夹名称

java - Netty - 忽略失败的 IP_TOS 设置

java - 创建要写入文件 Java 的 PPM 图像

java - 如何获取客户端计算机操作系统的用户友好名称?

java - 根据实现中使用的泛型(应用类型)使用接口(interface)的一种实现

java - 使用 google texttospeech : Could not find TLS ALPN provider; no working netty-tcnative, Conscrypt 时出错,或 Jetty NPN/ALPN 可用

java - 将 Pushy 与 ALPN 和 MSSQL Jdbc 驱动程序一起使用会引发 java.lang.IllegalAccessError

java - 将对象放入 ChannelBuffer

java - 设置开发服务器的上下文 [playframework 2.1.3]