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

Netty上作为Tcp客户端的单例bootstrap和pipelineFactory

况喜
2023-03-14

我正在使用Netty实现TCP协议的服务器和客户端。在服务器端,我为它侦听的每个端口创建了一个bootStrap和pipelineFactory类的实例,它的工作非常迅速。

然而,在客户端,我还没有一个关于如何构造它的清晰的想法。我需要打开数千个连接到数千个不同的目的地。我正在Spring框架上开发这个项目,这样我就可以轻松地创建单例bean并将它们作为属性注入。我正在评估三种选择:

>

  • 使用ClientBootstrap和PipelineFactory的单个实例。每个连接都使用一些像这样的代码来获得一个通道:

    public Channel connect(final InetSocketAddress serverAddress, final ChannelPipelineFactory pipelineFactory, int timeout, TimeUnit unit) throws InterruptedException {
    ChannelFuture future;
    synchronized (bootstrap){
        bootstrap.setPipelineFactory(pipelineFactory);
        future = bootstrap.connect(serverAddress);
        future.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                if (future.isSuccess()) {
                    //TODO set here some channelLocal properties I need to configure the session (eg: user, password etc...)
                }
                else{
                    throw new RuntimeException(future.getCause()
                            .getMessage());
                }
            }
        });
    }
    return future.getChannel();
    

    }

    我的解决方案还必须能够配置管道以启用或禁用SSL或日志处理程序,可能使用这个Abe解决方案来配置getPipeline()

    >

  • 我的第二个选项是使用ClientBootstrap的单个实例,但在每个传出的客户端连接上创建一个新的PipelineFactory。这有助于我配置我拥有的管道,因为我可以在pipelineFactory实例上设置属性。

    第三个选项是在每个传出连接上创建新的引导对象和pipelineFactory。这允许我在每个连接上配置tcp.delay或tcp.keepalive等属性,并允许我删除connect方法上的synchronized块,这可以加快客户端连接。

    我认为第一个是最快的,使用最低的内存,但第三个是最可配置的,也许容易开发。

    你能给我一些关于这种方法的利弊的建议吗?也许其中一个错了?

    非常感谢!

  • 共有1个答案

    鲜于星波
    2023-03-14

    ClientBootstrap实例很便宜。我只需要为每个连接创建一个新的连接,并为所有连接重用NioSocketClientChannelFactory。或者,如果可以,您可能希望对ssl连接使用一个引导程序,对非ssl使用一个引导程序。这将使您免受内存开销的影响。

     类似资料:
    • 在探索和实现Proact设计模式后,遇到了一个问题,即客户端(“C”客户端)连接在限制后不再接受。开始探索netty。这是我试图做的1。C客户端建立连接2。Java服务器接受连接并开始使用TCP向客户端发送8 Mb大小的字节缓冲区。有什么想法吗?netty是一个好的选择吗?我浏览了netty的一个很好的例子,不幸的是不走运。 先谢谢你。 尊敬的Ravi

    • 我正在构建一个tcp客户端来接收和发送消息。我按照Netty用户指南中的步骤编写了一个简单的tcp客户端,其中包含一个扩展的自定义处理程序。 在hander中,我存储了< code > ChannelHandlerContext : 然后我有一个发送方法,它使用发送消息: 我发现的另一个选项是在客户机类中使用

    • 我正在努力与Netty 4.0.8网络套接字客户端示例和SSL,我似乎无法将数据发送到Netty SSL网络套接字服务器示例。尽管围绕这个问题已经有很多帖子了,(我相信我已经浏览了所有的帖子),最常见的建议是在管道的开头添加一个sslHandler,但它不起作用。握手似乎是成功的,因为它也表明了一个相关的问题在这里。 我记得4.0版的情况也一样。0,但我还是设法让它工作了。然而,当我升级到4.0时

    • tcp 客户端例程 tcp 客户端例程 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * *//* * 程序清单:tcp 客户端 * * 这是一个 tcp 客户端的例程 *

    • 创建 TCP 客户端 最简单的方法来创建一个 TCP 客户端,使用默认选项如下所示: NetClient client = vertx.createNetClient(); 配置 TCP 客户端 如果你不想使用默认值,则创建TCP 客户端时,通过传入NetClientOptions实例可以配置: NetClientOptions options = new NetClientOptions().s

    • 我想写一个基于Netty的客户端连接到服务器。客户端将在带有HTTP代理的公司防火墙后面运行。 如果 Netty 是否支持通过代理 OOB 进行连接,我找不到任何信息。 在以前的情况下,当我编写客户端时,我总是在创建套接字时自己完成这项支持,但Netty是一个流行的框架,我希望它能够支持通过代理的连接。 (我要实现的协议不是基于HTTP的)