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

使用Netty的Java客户endpoint对点

孙玮
2023-03-14

我正在编写一个进程,它必须连接(并保持活动)到几个(数百个)远程对等点,并管理对它们的消息传递/控制。

我制作了这个软件的两个版本:第一个版本使用经典的“每个连接线程”模型,第二个版本使用标准的javaNIO和选择器(以减少线程分配,但存在问题)。然后,环顾四周,我发现Netty在大多数情况下都能提高很多,于是我开始第三次使用它。我的目标是保持资源使用率非常低,保持快速。

一旦编写了具有自定义事件和动态处理程序切换的管道工厂,我就停止了最肤浅的部分:它的分配。我阅读的所有示例都使用具有单个连接的单个客户端,因此我产生了疑问:我设置了一个通道工厂和一个管道工厂,因此每个(新客户端引导(工厂)).connect(地址)都会使用新管道创建一个新通道。是否可以创建共享管道并将业务逻辑延迟到线程池?如果是这样,如何?

使用标准的java NIO,我设法使用了两个小的线程池(线程

通信应通过单个通道进行,该通道可以接收来自远程对等方的定时消息或进行三方控制(command-ack-ok)。

另一方面:一旦事件到达最后一个处理程序,会发生什么?它在那里吗?我能提取它吗?或者我能从任何地方提取信息吗?

共有1个答案

姬乐
2023-03-14

您应该只有一个引导(即一个ChannelFactory和一个PipeLineFactory)。管道,甚至单个通道处理程序可以共享,但它们通常是每个通道唯一创建的。

管道中可以有一个执行处理程序,用于将执行从 IO 工作线程传输到线程池

但是你为什么不在http://netty.io/wiki/阅读详尽的留档呢?你会在那里找到你所有问题的答案。

 类似资料:
  • 实际上,我正在使用Netty编写一个客户机-服务器程序,但我陷入了一个自上周以来无法解决的问题。 因为这是一个相当大的程序,我不能粘贴我所有的代码,但是,我开始使用这个例子从Netty的github(https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example/securechat) 在游戏的上下文中,

  • 我已将Tomcat实例配置为在端口8443上使用SSL。我通过浏览器上的https:8443点击tomcat主页面,验证了它的有效性。 现在,我正试图理解我需要做什么才能让Java程序从tomcat服务器上的HTTPS URL读取。我按照这里的指示: Java SSL教程 我只是抄了这本书。密钥库文件一直保存到我的客户机上,这是我在web服务器上用Java的keytool生成的。它是自签名的,只是

  • 问题内容: 我需要使客户端能够建立许多连接。我使用Netty 4.0。不幸的是,所有现有示例都没有显示如何创建大量连接。 这是正确的决定吗?还是会更好? 问题答案: 是的,它几乎是正确的。您唯一需要更改的就是在每个连接上创建NioEventLoopGroup。 NioEventLoopGroup实例非常昂贵,因此应该共享它们。创建一个实例并共享它,方法是每次都将同一个实例传递给Bootstrap.

  • 我使用请求一组URL。大多数URL属于相同的主机。似乎会为每个URL创建一个全新的TCP连接,即使已经为上一个URL建立了到主机的连接。当数百个连接同时建立时,一些服务器会丢弃新的连接或开始缓慢响应。 代码示例: 在日志中,我看到同一个远程主机的本地端口不同,活动和非活动连接的总和远远高于不同主机的数量。这就是为什么我认为没有重用已经建立的连接。 是否可以使用HTTP客户端通过与主机的同一TCP连

  • 我将创建一个身份验证服务器,它本身与一组不同的Oauth2.0服务器交互。Netty似乎是在这里实现网络部分的一个很好的候选者。但在开始之前,我需要澄清一些关于netty的细节,因为我是新手。例行程序如下: > < li> 服务器接受来自客户端的HTTPS连接。 然后,不关闭第一个连接,它通过HTTPS与远程OAuth2.0服务器建立另一个连接并获取数据 毕竟,服务器将结果发送回客户端,客户端应该

  • 如何在基于网络的 HTTP 客户端中重试 HTTP 请求? 请考虑以下处理程序,如果收到 HTTP 响应代码 503,它将尝试在 1 秒后重试 HTTP 请求: 在本例中,当我写入通道时,管道中的其他处理程序会看到HttpObjects,但实际上不会再次执行HttpRequest——只接收到一个HttpResponse。 我认为在这种情况下我只是滥用了 Channel,我需要创建一个新的通道(表示