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

对多个客户端使用Netty4

邓开济
2023-03-14

我正在使用Netty4创建一个需要为多个客户端连接提供服务的服务器。ServerBootstrap由父线程组和工作线程组构成。根据ServerBootStrap上的文档。group()方法it

“为父(接收器)和子(客户端)设置EventLoopGroup。这些EventLoopGroup用于处理SocketChannel和Channel的所有事件和IO。”

据我所知,ParentExecutor组将处理任何传入的连接,并将其传递给子Executor组执行。因此,为了服务于许多客户机,我有以下设置

final ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup(Runtime.getRuntime()
            .availableProcessors() * 3))
    .channel(NioServerSocketChannel.class)
    .childHandler(new MyInitializer());

现在的问题是,我的Handler中的以下方法会在子执行器组上执行吗?我怀疑它是通过SingleThreadEventExecator以单线程方式处理的?

protected void channelRead0(final ChannelHandlerContext ctx, final AppMessage msg)
        final AppMessage msg) throws Exception {

共有2个答案

濮阳鸿卓
2023-03-14

是,在fireChannelRead()执行期间,处理程序将在子线程组中执行

易京
2023-03-14

子组也称为工作组,实际上是Netty创建的一个线程(在Netty中称为EventLoop)池。NioEventLoopGroup默认的池大小为Runtime.getRuntime(). avuableProcess()*2)。每次连接到来时,Netty都会从子组中安排一个线程(aka,EventLoop)来处理通道和消息传输等。所有属于ChannelPipeline的处理程序都将在这个线程中执行。

 类似资料:
  • 问题内容: 我正在使用RMI编写密码系统的原型。 我有一个问题,因为当我启动两个客户端时,它们从OneTimePad类的服务器中的一个对象获得了响应。 因此客户端A获取为客户端b保留的密钥,由于特定的算法,这种情况不会发生。 服务器仅向客户端发送E和N变量(例如在RSA中),因此我无法序列化OneTimePad对象并通过网络发送它(因为它将具有所有密钥)。 如何为每个客户端创建OneTimePad

  • 问题内容: RMI是否自己处理多个客户端?即 是否可以同时使用多个客户端的服务器功能? 如果没有,我该怎么做? 如果是,它如何工作?每次 调用 都会创建一个新线程吗?如果一个客户端阻止了该功能,那么下一个客户端会发生什么?等等 问题答案: 是 这个怎么运作?每次调用都会创建一个新线程吗?如果一个客户端阻止了该功能,那么下一个客户端会发生什么?等等 它为每个客户端连接创建一个线程。 如果一个客户端调

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

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

  • 我有一个与其他几个服务交互的服务。因此,我为它们创建了单独的webclients(因为BasePath不同)。我已经根据https://docs.spring.io/spring/docs/5.1.6.release/spring-framework-reference/web-reactive.html#webflux-client-builder-reactor-timeout分别为它们设置了

  • 我正在开发一个新的应用程序,该应用程序订阅JBoss 4上的两个主题并处理传入的消息。实际上,我正在使用两连接的持久订阅。 当我对持久订阅使用相同的ClientID时,容器将失败,错误如下: 是否有可能两个人对两个不同的目的地使用相同的clientId。是否有其他可以使用一个容器实例处理多个目的地? 我们尝试使用相同的clientId的原因是因为我们尝试用it订阅替换旧的应用程序。这个旧应用程序连