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

这里的问题是,每次从网络读取数据时,我都必须进行地图查找。那里有很多浪费的工作。因此,令我激动的是,您可以将任意对象类型附加到SelectionKey上,即使我们现在正在处理其他事件(在OP_READ期间进行检索,然后放入到方法中),也可以在调用SelectionKey.attachment()时轻松检索该对象类型。在OP_ACCEPT期间映射)。

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

抱歉,我的代码要发布到这里有点长,但是如果您查看此线程中的注释:
link text
...您会看到其他一些人基本上得出了相同的结论:attach()和attachment()无效,并且永远不会有效。

是否有使它正常工作的技巧,还是我每次都需要在地图上手动进行查找而烦恼的额外开销?

最后,是否有一种方法可以在新的子类中“包装” SelectionKey,以正确处理attach()和attachment()?

谢谢!

最佳答案

我已经成功地将对象附加到SelectionKeys上,没有任何问题,但仅来自同一事件。例如,第一次获取OP_READ时,我将一个对象附加到SelectionKey上,随后读取时将其检索到,并且可以正常工作。也许OP_ACCEPTOP_READ处理不同的密钥是因为它们是不同的事件,但是我认为对于相同的连接来说SelectionKey应该是相同的...但是,即使您使用相同的IP进行不同的连接,您也会获得不同的SelectionKeys。

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

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

10-10 04:56