0

我很难理解如何在 Netty 4 中使用 Chunks。

我想要做的是以某种方式替换一个保持连接打开并每秒发送两次数据的 servlet。

因此,我查看了 servlet 返回的标头,现在有一个 Netty 处理程序扩展ChannelInboundMessageHandlerAdapter<FullHttpRequest>.

我实际上在我的messageReceived(...)方法中做这样的事情:

HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1,
                                                HttpResponseStatus.OK);
// initialize response
HttpHeaders headers = response.headers();
headers.set(HttpHeaders.Names.CONTENT_TYPE, "text/event-stream");
headers.set(HttpHeaders.Names.CACHE_CONTROL,
            "no-cache, no-store, max-age=0, must-revalidate");
headers.set(HttpHeaders.Names.PRAGMA, HttpHeaders.Values.NO_CACHE);
headers.set(HttpHeaders.Names.TRANSFER_ENCODING, HttpHeaders.Values.CHUNKED);
ctx.write(response);

ChunkedWriteHandler在上述处理程序代码之前的管道中添加了一个。

现在,如果我做对了,我现在应该ChunkedInput在我的频道中写入 s 以发送数据片段

我创建了一个ChunkedInput像这样的子类:

private class MyChunk implements ChunkedByteInput {
    private final ChannelHandlerContext ctx;
    private final String json;
    private boolean done = false;

    private HystrixChunk2(ChannelHandlerContext ctx, String json) {
        this.ctx = ctx;
        this.json = json;
    }

    @Override
    public boolean readChunk(ByteBuf buffer) throws Exception {
        buffer.writeBytes("data: ".getBytes())
                .writeBytes(json.getBytes())
                .writeBytes("\n".getBytes());
        done = true;
        LOGGER.info("Wrote chunck");
        return true;
    }

    @Override
    public boolean isEndOfInput() throws Exception {
        return done;
    }

    @Override
    public void close() throws Exception {
        ctx.channel().close();
    }
}

基本上在我的messageReceived(..)方法中,我只是编写了该类的一些实例。

但是我可能发现了一个错误,或者更可能不明白如何在 Netty 中使用块,因为我的套接字的输出上没有写入任何内容......

4

1 回答 1

0

实际上,我遇到的这个问题是由于我发送了 HTTP OK 响应而不是 101-CONTINUE。

现在似乎工作正常。

于 2013-01-31T12:44:42.023 回答