Java:SelectionKey.attach()坏了吗?

Div*_*ero 3 java nio nonblocking

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

这里的问题是我必须进行地图查找每次从网络读取数据.那里有很多浪费的工作.所以,我很高兴看到你可以将一个任意对象类型附加到SelectionKey,当你调用SelectionKey.attachment()时,它应该很容易被检索,即使我们现在正处理一个不同的事件(在OP_READ期间检索而不是放入OP_ACCEPT期间的地图).

问题是它不起作用.当我检索附件时,它始终为null.如果我通过attach()设置附件然后立即调用attachment(),它确实有效.不知何故之间,它失去了联想.

对不起,我的代码在这里发帖有点长,但是如果你看看这个帖子中的评论: 链接文本 ......你会看到其他一些人基本上得出了相同的结论:attach()和attachment()不起作用,从来没有.

是否有一个技巧让它工作,或者我是否坚持在地图中手动执行查找所需的邪恶开销每次都有一个新的读取事件要处理?

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

谢谢!

Cho*_*hos 6

我已成功将对象附加到SelectionKeys而没有任何问题,但仅来自同一事件.例如OP_READ,我第一次得到一个,我将一个对象附加到SelectionKey,并在后续读取我检索它,它工作正常.也许OP_ACCEPTOP_READ处理不同的密钥,因为它们是不同的事件,但我认为SelectionKey对于同一个连接应该是相同的...但是如果你使用相同的IP建立不同的连接,你将得到不同的SelectionKeys.

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