网络重用渠道

时间:2012-11-13 20:43:49

标签: netty channels

我想创建一个重用频道但我无法弄清楚的连接池

执行此测试

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();

}

我在第二个channel.write(request)....

中遇到了ClosedChannelException

是否存在重用频道的方法?或保持频道开放?

提前致谢

1 个答案:

答案 0 :(得分:2)

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

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

Connection: Keep-Alive

原始请求。

这是打开频道所必需的(这是您在这种情况下想要做的事情)。

频道关闭后,必须创建新频道。您无法重新开启该频道。 Channel.getCloseFuture()返回的ChannelFuture对于通道是最终的(即,常量),并且在此未来的一次isDone()返回true它不能被重置。这就是无法重复使用封闭渠道的原因。

但是,您可以根据需要多次重复使用开放频道;但是你的应用程序必须正确地谈论HTTP协议才能实现这一目标。