Вот мой прецедент ... У меня есть служба восходящего потока, которая отправляет мои данные приложения Netty по сети, и эти данные должны быть опубликованы для нескольких клиентов, подключенных к Netty. Данные, отодвинутые к клиентам, должны быть «Передача-кодировка передачи: chunked».Как правильно использовать ChunkedStream
Я нашел ChunkedStream
и хотя это может быть, я мог бы создать PipedInputStream
и PipedOutputStream
(подключенный к PipedInputStream
) и записать ChunkedStream
к каналу. Затем, когда данные, полученные от моей вверх по течению службы я мог записать данные в PipedOutputStream
каналов и было бы быть отправлены клиентам:
В channelConnected
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 -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 ###
Есть мысли? Может быть, есть лучший способ сделать это?
Вот скриншот как раз перед пишет «Foo» на канале: http://screencast.com/t/XATjUfCsre6U Заметим, что вы можете увидеть фрагмент содержит «70, 79, 79 "= FOO –
Это действительно странно, потому что я вижу, что' write0' из 'NioWorker' вызывается и записывается на канал, но ничего на другом конце. Я даже не забудьте использовать «-N» завитка, чтобы предотвратить буферизацию на стороне клиента. Я также позволил ему запустить цикл в течение некоторого времени, думая, что что-то нужно покраснеть, но все равно нет кубиков. –
Это должно быть я. Я вижу это в WireShark. Может быть, есть терминатор, который я не передаю, чтобы сообщить, что кусок был получен. –