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

多个Netty客户端向一个Netty服务器发送数据

阎丰
2023-03-14

我使用的是Netty 3.9.5,我有一个简单的客户机-服务器设置,我从http://en.wikipedia.org/wiki/Netty_(软件)#Netty\u TCP\u示例。我扩展了这个示例,将Java search plan对象从客户端发送到服务器。在这个网站上跟踪用户的帮助下,我已经能够让这个程序按预期运行。

现在,我想让我的读卡器/服务器程序同时接受多个客户端。我想我会使用下面列出的原始管道工厂代码:

channelFactory = new NioServerSocketChannelFactory(bossThreadPool,
            workerThreadPool);
    this.bootstrap = new ServerBootstrap(channelFactory);
    this.bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    new ObjectEncoder(),
                    new ObjectDecoder(ClassResolvers
                            .cacheDisabled(getClass().getClassLoader())),
                    new ServerMessageHandler());
        }
    });

并进行此更改:

channelFactory = new NioServerSocketChannelFactory(bossThreadPool,workerThreadPool, 3);

我认为这将在workerThreadPool中创建3个工作线程,从而能够处理3个客户端连接。这不起作用。第一个客户端连接按预期工作,但第二个连接最终引发连接超时异常。

问题:

>

  • 我对workerThreadPool的假设正确吗?如果是,我忘记了什么
  • 现在,我的代码仍然只使用一个端口进行连接。是否需要为每个可能的连接提供唯一的端口?我没有看到这样的例子。我需要调整bind方法还是acceptor。isBound方法是否适用于可能的多个连接?

    public boolean connect() {
    boolean status = false; // assume failure
    
    final int LISTEN_PORT = 53233;
    
    /*
     * We use a channel when attempting to bind the ServerBootstrap to
     * ensure if the operation was successful
     */
    acceptor = this.bootstrap.bind(new InetSocketAddress(LISTEN_PORT));
    
    /*
     * We make sure the Server could bind to the port by calling the
     * isBound() method in the Channel class.
     */
    if (!acceptor.isBound()) {
        logger.error(ErrorMessage.SERVER_UNABLE_TO_BIND + LISTEN_PORT);
    
        status = false;
    } else {
        status = true;
        logger.info(Message.SERVER_CONNECTION_SUCCESSFUL + LISTEN_PORT
                + "!" + Message.SERVER_AWAITING_CONNECTIONS);
    }
    
    return status;
    }
    

    任何帮助都将不胜感激。谢谢

  • 共有1个答案

    仰钧
    2023-03-14

    你说得对,工作池与并发连接数相关联。你以工人身份通过了什么样的遗嘱执行人?我建议使用执行器。newCachedThreadPool()。在这种情况下,In建议不要在NioServerSocketChannelFactory中设置任何第三个值,因为默认情况下,它将使用NumberOfCore*2,所以就像之前一样。

    另外,我假设您的ServerMessageHandler不会永远阻塞(或者很长时间),因为如果阻塞了,那么您必须在管道中的它之前添加类似于OrderedMemoryAwareThreadPoolExecutor的内容,以释放工作线程

     类似资料:
    • 我有一个基本的Netty服务器(来自教程)(http://netty.io/wiki/user-guide-for-4.x.html),它会接收来自客户端的请求,但如何向客户端发送字符串呢? 例如,在普通的Minecraft服务器上,您在配置文件中指定“MOTD”,当客户端从服务器列表中发出信号时,它将显示该字符串。我需要做同样的事情,但是从我的服务器代码中。

    • 我需要让客户能够建立许多连接。我使用Netty 4.0。不幸的是,所有现有的示例都没有显示如何创建大量连接。 这是正确的决定吗?还是会更好?

    • 我刚刚把我的Netty 3软件转换成5,我遇到了一个问题。只有一个客户,一切都很好。我可以使用两个解码器(它们可以正常切换)并允许我登录。 当我尝试连接另一个客户端时,无论第一个客户端是否仍然连接,都会出现问题。第一个客户端保持连接绝对正常,但第二个客户端根本无法连接(不通过第一个解码器)。 这是我的引导程序: 第一解码器: http://pastebin.com/9FWzXSVE 第二个解码器:

    • 我有一个Netty客户端和一个Netty服务器,并按照主要教程后,为了有一个EchoClient/服务器,我想让它,使我的客户端发送消息到我的服务器,当他第一次连接到它。 下面是我的的方法,这些方法应该解决这个问题: 但是正如你所看到的,教程使用了一个ByteBuf和一个String似乎不起作用! 下面是我如何在我的方法中显示收到的消息: 但是当为使用并在构造函数中初始化它并发送它时,我的服务器不

    • 我正在试用netty,但当我响应时,客户端似乎没有收到我的消息。我使用Java NIO和socketChannel编写了相同的代码,看起来很好。我这样说是因为客户机会记录我发送的任何内容。下面是我的服务器 下面是我的服务器处理程序 } 示例响应: 我正在我的盒子上做一个tcpdump,我看到了我在电线上发送的内容,所以我不确定我做错了什么。而且,几分钟后,这会被记录下来,我不确定我在服务器或服务器

    • 似乎服务器拒绝了wireshark输出中的tls协商,但我从代码中看不出原因。它是基于工作的代码,只是它被否决了,因此我用新的API更新。代码是开始。需要使用真实的证书。有人知道为什么服务器发送tcp FIN,ack吗? 我有以下服务器代码: 23 16.856111 sonymobi_7f:55:af intelcor_25:1d:fc ARP 42 10.1.10.100在84:c7:ea:7