gpt4 book ai didi

Java:SelectionKey.attach() 损坏了吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:36:36 26 4
gpt4 key购买 nike

在我的 Java NIO 实现中,我无法让 SelectionKey.attach() 工作。基本上,一旦客户端连接(OP_ACCEPT interest ops),我将它们添加到一个映射中,在该映射中,它们的 IP 地址映射到一个为客户端维护状态的对象。然后,当发生 OP_READ 时,我再次检索客户端的 IP 地址,这次从映射中获取值并以这种方式获取客户端的状态对象。

这里的问题是每次从网络读取数据时我都必须进行 map 查找。那里有很多浪费的工作。因此,我很高兴看到您可以将任意对象类型附加到 SelectionKey,当您调用 SelectionKey.attachment() 时应该可以轻松检索到该对象,即使我们现在正在处理不同的事件(在 OP_READ 期间检索与放入在 OP_ACCEPT 期间映射)。

问题是它不起作用。当我检索附件时,它始终为空。如果我通过 attach() 设置附件,然后立即调用 attachment(),它确实有效。在不同的事件之间,它以某种方式失去了联系。

对不起,我的代码在这里发布有点长,但是如果你看看这个线程中的评论: link text...您会看到其他一些人基本上得出了相同的结论:attach() 和 attachment() 不起作用,而且从来没有起作用。

是否有让它工作的技巧,或者每次有新的读取事件要处理时,我是否都必须忍受手动在 map 中进行查找所必需的邪恶开销?

最后,有没有办法将 SelectionKey“包装”到一个新的子类中,该子类将正确处理 attach() 和 attachment()?

谢谢!

最佳答案

我已经成功地将对象附加到 SelectionKeys,没有任何问题,但只是来自同一个事件。例如,我第一次获得 OP_READ 时,我将一个对象附加到 SelectionKey 并在随后的读取中检索它,它工作正常。也许 OP_ACCEPTOP_READ 处理不同的键,因为它们是不同的事件,但我认为 SelectionKey 对于相同的连接应该是相同的......但是如果你建立不同的连接即使来自相同的 IP,您也会获得不同的选择键。

更新:我刚刚检查了我的代码,有一点非常重要:我根本没有调用 attach();我使用了 SelectableChannel.register(Selector sel, int ops, Object att) 方法。如果这样做,对 SelectionKey 上的 attachment() 的后续调用将起作用。

关于Java:SelectionKey.attach() 损坏了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1310065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com