当前位置: 首页 > 知识库问答 >
问题:

netty重用通道

章学义
2023-03-14

我想创建一个可以重用通道的连接池,但我想不通

执行此测试

public void test() {


    ClientBootstrap client = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));

    client.setPipelineFactory(new ClientPipelineFactory());

    // Connect to server, wait till connection is established, get channel to write to
    Channel channel = client.connect(new InetSocketAddress("192.168.252.152", 8080)).awaitUninterruptibly().getChannel();
    {
        // Writing request to channel and wait till channel is closed from server
        HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "test");

        String xml = "xml document here";
        ChannelBuffer buffer = ChannelBuffers.copiedBuffer(msgXml, Charset.defaultCharset());
        request.addHeader(HttpHeaders.Names.CONTENT_LENGTH, buffer.readableBytes());
        request.addHeader(HttpHeaders.Names.CONTENT_TYPE, "application/xml");
        request.setContent(buffer);

        channel.write(request).awaitUninterruptibly().getChannel().getCloseFuture().awaitUninterruptibly();

        channel.write(request).awaitUninterruptibly().getChannel().getCloseFuture().awaitUninterruptibly();
    }
    client.releaseExternalResources();

}

我在第二个频道遇到了ClosedChannel异常。写入(请求)。。。。

存在重用通道的方法吗?还是保持通道打开?

提前感谢

共有1个答案

裴育
2023-03-14

第二次写入失败的原因是服务器关闭了连接。

服务器关闭连接的原因是您未能添加HTTP标头

Connection: Keep-Alive

原始请求

这是必需的,以便保持通道打开(这是您在本方案中想要做的)。

通道关闭后,您必须创建一个新通道。您不能重新打开通道。Channel.getCloseFuture()返回的ChannelFuture是通道的最终值(即常量),一旦isDone()返回true,它就不能重置。这就是关闭的通道不能重用的原因。

但是,您可以根据需要多次重用开放通道;但是您的应用程序必须正确地讨论HTTP协议才能完成此操作。

 类似资料:
  • 我和Netty有一个http服务。对于一组请求,在http正文中只有“{}”的相同答复。我有一个想法,可以避免为每个这样的请求创建新的缓冲区,所以我使用了: 在我的SimpleChannelInboundHandler中。它只适用于第一个查询,之后我开始有 所以看起来缓冲区在第一次回复后会自动释放。有这样的缓冲的正确方法是什么?

  • 文件上说 请注意,此处理程序的管道覆盖范围为“全部”,这意味着必须仅创建一个此类处理程序并在所有通道之间共享,因为计数器必须在所有通道之间共享。 我理解必须共享此处理程序。 假设我有两组通道。我可以为每个组使用不同的GlobalChannelTrafficShapingHandler实例吗?

  • 我有一个Netty 3.95客户端和服务器。客户端向服务器发送任务计划。可以发送的计划数量基本上没有限制,有些计划比其他计划更重要。我有三个优先级(高、中、低),我给每个任务计划分配了一个优先级(当我把数据读入客户端时的DSCP值)。)我希望这允许更重要的任务计划首先到达服务器。 我已经将路由器的出站数据速率调至最低,并向路由器发送了大约1000个计划。我可以看到任务计划到达服务器,它们到达得非常

  • 嗨,当IdleStateHandler被添加到管道时,我遇到了一个问题。当我使用 我建议每个通道在30秒内没有任何活动(读或写)时触发IdleState事件。但此设置适用于定义IdleStateHandler的管道所处理的每个通道。问题是我如何为每个频道设置不同的空闲时间?

  • Netty重写SimpleChannelInboundHandler后的ChannelRead0方法从未被调用? 希望结果:重写后的方法【RpcRequestHandler#channelRead0】每次有新请求都被调用

  • 我想在Netty nio中创建一个包含两个客户端和一个服务器的通信系统。更具体地说,首先,我希望当两个客户端与服务器连接时,从服务器发送消息,然后能够在两个客户端之间交换数据。我正在使用这个例子中提供的代码。我对代码的修改可以在这里找到:链接 似乎通道读取在服务器处理程序中工作,因此它始终返回 1,但当连接第二个客户端时,它不会更改为 2。当两个客户端都连接到服务器时,如何从服务器正确检查?如何从