Вот мой пример использования ... У меня есть восходящий сервис, который отправляет данные моего приложения Netty по сети, и эти данные необходимо опубликовать нескольким клиентам, подключенным к Netty. Данные, передаваемые клиентам, должны быть HTTP «Transfer-Encoding: chunked».
Я нашел ChunkedStream
и, хотя, возможно, я мог бы создать PipedInputStream
и PipedOutputStream
(подключенные к PipedInputStream
) и записать ChunkedStream
в канал. Затем, когда данные будут получены от моего вышестоящего сервиса, я могу записать данные в PipedOutputStream
каналов, и они будут отправлены клиентам:
В канал подключен
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream(in);
ctx.getChannel().write( new PersistentChunkedStream(in) );
Отдельный поток публикует данные для подключенных каналов
ChannelBuffer buff = ChannelBuffers.copiedBuffer("FOO",CharsetUtil.UTF_8);
out.write( buff.array() );
channel.get(ChunkedWriteHandler.class).resumeTransfer();
Мне пришлось расширить ChunkedStream
, чтобы вернуть null
из nextChunk
, если доступно 0 байт (чтобы «приостановить» запись без зависания потока), поэтому я вызываю resumeTransfer
после записи в PipedOutputStream
соответствующего канала. Когда я отлаживаю и перебираю код, я вижу, как вызывается flush
из ChunkedWriteHandler
, что вызывает:
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 ###
Есть мысли? Может быть, есть лучший способ сделать это?