我正在为我的项目重新编写核心 NIO 服务器网络代码,并试图弄清楚何时应该“存储”连接信息以供将来使用。例如,一旦客户端以通常的方式连接,我存储并关联该连接的客户端的 SocketChannel 对象,以便我可以随时向该客户端写入数据。通常我使用客户端的 IP 地址(包括端口)作为映射到 SocketChannel 对象的 HashMap 中的键。这样,我可以轻松地查找他们的 IP 地址并通过该 SocketChannel 向他们异步发送数据。
这可能不是最好的方法,但它有效,而且项目太大而无法更改其基本网络代码,尽管我会考虑建议。然而,我的主要问题是:
我应该在什么时候“存储” SocketChannel 以备将来使用?一旦连接被接受(通过 OP_ACCEPT),我一直在存储对 SocketChannel 的引用。我觉得这是一种有效的方法,因为我可以假设当 OP_READ 事件到来时映射条目已经存在。否则,每次 OP_READ 发生时我都需要对 HashMap 进行计算量很大的检查,很明显与 OP_ACCEPT 相比,客户端会发生更多这些情况。我猜我担心的是,可能有一些连接被接受(OP_ACCEPT)但从不发送任何数据(OP_READ)。这可能是由于防火墙问题或客户端或网络适配器出现故障。我认为这可能会导致“僵尸”连接不活跃但也永远不会收到关闭消息。
我重写我的网络代码的部分原因是,在极少数情况下,我得到一个进入奇怪状态的客户端连接。我在想我处理 OP_ACCEPT 与 OP_READ 的方式,包括我用来假设连接“有效”并且可以存储的信息,可能是错误的。
很抱歉我的问题不是更具体,我只是在寻找最好、最有效的方法来确定 SocketChannel 是否真正有效,以便我可以存储对它的引用。非常感谢您的帮助!