这是我的用例...我有一个上游服务,它通过网络发送我的 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
。当我调试并逐步执行代码时,我可以看到正在调用 ChunkedWriteHandler
的 flush
,它会调用:
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/