有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么netty的handler成员变量在使用新handler()处理请求时不重置

这是我的通道初始化器

ch.pipeline().addLast("httpServerCodec", new HttpServerCodec());
        ch.pipeline().addLast(new HttpObjectAggregator(65536));
        ch.pipeline().addLast(new ChunkedWriteHandler());
        ch.pipeline().addLast(business, new HttpSnoopServerHandler());

以下是HttpSnoopServerHandler代码

public class HttpSnoopServerHandler extends SimpleChannelInboundHandler<Object> {

    private HttpRequest request;
    /** Buffer that stores the response content */
    private final StringBuilder buf = new StringBuilder();

     @Override
    protected void channelRead0(ChannelHandlerContext ctx, Object msg) {
        // ignore process body


        buf.append("{\"key1\":[\"value1\"],\"key2\":\"value2\"}");

        // Write the response.
        ctx.writeAndFlush(response);

    }

当我第一次请求时,服务器会响应我

// 20200428163637
// http://localhost:8080/

{
  "key1": [
    "value1"
  ],
  "key2": "value2"
}

请求两次,它就会回应我

{"key1":["value1"],"key2":"value2"}{"key1":["value1"],"key2":"value2"}{"key1":["value1"],"key2":"value2"}

等等

我的问题是服务器将使用新的处理程序()来处理请求。为什么处理程序不重置成员变量


共 (1) 个答案

  1. # 1 楼答案

    ChannelInitializer将在每个Channel调用一次(一旦建立了新连接)。因此,如果你保持连接打开,你需要自己重置状态