Java:SelectionKey.attach()坏了吗?
在我的
Java NIO实现中,我无法使SelectionKey.attach()工作.基本上,一旦客户端连接(OP_ACCEPT兴趣操作),我将它们添加到一个地图,在那里他们的IP地址映射到一个维护客户端状态的对象.然后,当OP_READ发生时,我再次检索客户端的IP地址,这次从地图中获取值并以此方式获取客户端的状态对象.
这里的问题是我必须进行地图查找每次从网络读取数据.那里有很多浪费的工作.所以,我很高兴看到你可以将一个任意对象类型附加到SelectionKey,当你调用SelectionKey.attachment()时,它应该很容易被检索,即使我们现在正处理一个不同的事件(在OP_READ期间检索而不是放入OP_ACCEPT期间的地图). 问题是它不起作用.当我检索附件时,它始终为null.如果我通过attach()设置附件然后立即调用attachment(),它确实有效.不知何故之间,它失去了联想. 对不起,我的代码在这里发帖有点长,但如果你看一下这个帖子中的评论: 是否有一个技巧让它工作,或者我是否坚持在地图中手动执行查找所需的邪恶开销每次都有一个新的读取事件要处理? 最后,有没有办法在一个新的子类中“包装”SelectionKey,它将正确处理attach()和attachment()? 谢谢! 解决方法
我已成功将对象附加到SelectionKeys而没有任何问题,但仅来自同一事件.例如,我第一次获得OP_READ时,我将一个对象附加到SelectionKey,并在后续读取时检索它,它工作正常.也许OP_ACCEPT和OP_READ处理不同的键,因为它们是不同的事件,但我认为SelectionKey对于同一个连接应该是相同的…但是如果你使用相同的IP建立不同的连接,你将得到不同的SelectionKeys.
更新:我刚检查了我的代码并且有一些非常重要的东西:我根本没有调用attach();我使用了SelectableChannel.register(Selector sel,int ops,Object att)方法.如果这样做,后续调用SelectionKey上的attachment()将起作用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |