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

标签 java sockets netty

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

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

channel 处理程序,通过传递给其channelRead(...) 方法的ChannelHandlerContext 对象,可以访问“属性”。然而,这似乎是为了在 channel 处理程序级别设置状态,而不是每个套接字连接级别AttributeMap 的 Javadocs 明确指出:“请注意,不可能 [sic] 具有多个具有相同名称的键”。大多数示例都将其用于简单的“计数器”插图。

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

有没有办法拥有每个连接的状态,同时仍然在您的 channel 处理程序类上使用 @Sharable 注释,并充分利用 Netty 的非阻塞优势?或者这个用例的方法是简单地将实例变量放在您的 channel 处理程序上,删除 @Shareable 注释,并为每个传入连接生成一个新的连接处理程序(以及新线程?)?

最佳答案

Channel 确实扩展了 AttributeMap,因此您只需在 channel 上设置/获取属性即可。 Channel 是套接字连接的抽象。

另一方面,为每个 Channel 创建一个 ChannelHandler 并在它们的字段中保存状态并没有错。 ChannelHandler 与线程无关,它们由 EventLoop 抽象,每个 Channel 只有一个 EventLoop >.

实际上恰恰相反:ChannelHandler 保证被同一个线程调用(Channel 的事件循环,或者当将处理程序添加到 Pipeline)。由于这一点,您既不需要同步,也不需要 channel 处理程序字段的 volatile 限定符。

关于java - 使用 Netty,如何存储每个套接字连接的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48486867/

相关文章:

java - 如何判断摇杆何时松开

Java URL 文本文件转字符串

Java TCP 服务器在收到 16384 字节 MAC OS 后不接受客户端请求

iOS:使用 CFStreamCreatePairWithSocketToHost 的套接字网络基础知识

java - http 服务器的 Netty 内存泄漏。什么时候发布消息?

java - JDBC 是否将数据库 session 时区设置为 Java 虚拟机的时区?

java - 多线程:将实例和局部变量传递给线程

c - 如何使用 C 语言的套接字将客户端连接到 IRC 服务器

websocket - Tomcat 8.5 线程模型

java - spring boot 的 netty 上下文路径