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

使用Netty,如何存储每个套接字连接的状态?

韦棋
2023-03-14

我正在使用Netty编写一个简单的服务器应用程序。它将接受长期运行的套接字连接(即telnet/ssh)...接收基于字符串的命令并发送基于字符串的响应。

我需要跟踪一些会话状态,关于套接字连接客户端上的特定实体。我不清楚该怎么办。

通道处理程序可以通过传递给其通道读取(…)方法的对象访问“属性”。然而,这似乎是为了在通道处理程序级别设置状态,而不是每个套接字连接级别。属性映射的Javadocs清楚地指出:“请注意,[sic]不可能有多个同名键”。这里的大多数示例都将其用于简单的“计数器”插图。

Netty的早期版本中有一个ChannelLocal类,可能与此相关。但从Netty 4.x开始它就被删除了,我认为它也是针对处理程序级状态而不是连接级状态的。

在通道处理程序类上仍然使用Sharable注释,并充分利用Netty的非阻塞优势的同时,有没有一种方法可以获得每个连接状态?或者,该用例的方法只是将实例变量放置在通道处理程序上,删除可共享的注释,并生成一个新的连接处理程序(因此产生新线程?)对于每个传入连接?

共有2个答案

姜宏盛
2023-03-14

您应该用@Sharable注释您的ChannelHandler,然后使用attr()将连接特定的属性存储在ChannelHandlerContext中。这在ChannelHandlerContext留档中解释得很好:“一个处理程序可以有多个上下文”。

不要使用ThreadPerChannelEventLoop,它会破坏线程模型的抽象。

谯嘉胜
2023-03-14

频道确实扩展了属性映射,因此您可以只设置/获取频道上的属性。通道是套接字连接的抽象。

另一方面,为每个通道创建一个通道处理程序并在其字段中保存状态并没有错。通道处理程序与线程无关,这些线程由事件循环抽象,每个通道只有一个事件循环。

实际上是相反的:保证由同一个线程调用通道处理程序(通道的事件循环,或将处理程序添加到管道时指定的事件循环)。因此,您不需要同步,也不需要通道处理程序字段的volatile限定符。

 类似资料:
  • 在下面的链接中,我试图使用-对(双向无线电) http://tim.dysinger.net/posts/2013-09-16-geting-starting-with-nanomsg.html

  • 问题内容: 我在Linux上使用 --skip-networking 选项使用MySQL 。 尝试使用JDBC将基于J2EE的应用程序(使用servlet)连接到MySQL数据库。 使用 禁用* 了 --skip-networking 选项的MySQL时,我以以下方式连接到数据库: * 启用 --skip-networking 选项后,我尝试将其连接为: 但这似乎不起作用,当我尝试连接到应用程序中

  • 问题内容: 我写了一个小程序,可以在特定端口上与服务器交互。该程序可以正常运行,但是: 一旦程序意外终止,并且此套接字连接一直处于状态显示。如果我尝试运行程序,它将挂起,并且必须强制将其关闭,这会累积 更多的 套接字连接。 有没有一种方法可以清除这些连接? 问题答案: 表示您的程序仍在运行,并且尚未关闭套接字(内核正在等待它关闭)。添加到以获取该pid,然后更加有力地将其杀死(如果需要,可以将其删

  • 我写了一个与特定端口上的服务器交互的小程序。程序运行良好,但是: 一旦程序意外终止,从那以后套接字连接就显示为状态。如果我试图运行一个程序,它就挂起,我必须强制关闭它,这会积累更多的套接字连接。 有办法冲洗这些连接吗?

  • 我可以通过JavaScript直接将Web套接字连接到我的PHP守护进程服务器:var websocket = new WebSocket(“ws://IP:PORT”);这将正确握手,但是当我尝试nginx代理 http://IP 它无法接收Sec-WebSocket-Key的标头值并且握手失败。 -最近更新:JavaScript根本无法连接,原因是:语法错误:指定了无效或非法的字符串! 变量:

  • 我有一个服务器和一个客户端,它们有自己的引导程序。我的问题是,不同的连接用于不同的目的。一个用于控制通道(与服务器通信并返回),然后建立其他连接以进行数据传输。我以编程方式将idlestate处理程序仅添加到需要它的连接管道中,但在调试之后,我发现无论连接如何,通道总是相同的。因此,我的数据传输正在影响生存。我通过向netty IdleStateHandler添加调试并输出通道id看到了这一点。很