Как я могу отправить более одного ответа клиенту из базы Httpserver на Netty - PullRequest
0 голосов
/ 20 марта 2019

Как я могу отправить более одного ответа клиенту с базы Httpserver в Netty?

Я пытаюсь сделать http-сервер по netty, и это работает. Теперь у меня есть вопрос, могу ли я отправить более одного ответа клиенту с Http-сервера? Например, клиент запрашивает сервер из веб-браузера, и сервер отвечает «привет», а затем отвечает «пока» через несколько секунд.

Я добавляю три ручки:

    sc.pipeline().addLast(new HttpResponseEncoder());
    sc.pipeline().addLast(new HttpRequestDecoder());
    sc.pipeline().addLast(new HttpChannelHandler());

В HttpChannelHandler я пытался ответить дважды, но не смог

public class HttpChannelHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if (msg instanceof HttpRequest) {
            //the content response to the client
            String resp_content = "hello";
            request = (HttpRequest) msg;
            boolean keepaLive = HttpHeaders.isKeepAlive(request);
            FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1,
                    OK, Unpooled.copiedBuffer(resp_content.getBytes("UTF-8")));
            response.headers().set(CONTENT_TYPE, "text/html;charset=UTF-8");
            response.headers().set(CONTENT_LENGTH,
                    response.content().readableBytes());
            if (keepaLive) {
                response.headers().set(CONNECTION, KEEP_ALIVE);
                //first response
                ctx.writeAndFlush(response);
                content = "test";
                response.headers().set(CONTENT_TYPE, "text/html;charset=UTF-8");
                response.headers().set(CONTENT_LENGTH,
                        response.content().readableBytes());
                //second response,but failed
                // exception io.netty.util.IllegalReferenceCountException: refCnt: 0
                response.content().writeBytes(resp_content.getBytes());
                ctx.writeAndFlush(response);
            }
        }
    }
}

1 Ответ

0 голосов
/ 20 марта 2019

Нет, это невозможно ... HTTP - это протокол в стиле "запрос / ответ".После того, как вы отправили ответ клиенту, вы можете отправить еще один ответ только при получении другого запроса.

...