- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的 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_ACCEPT
和 OP_READ
处理不同的键,因为它们是不同的事件,但我认为 SelectionKey 对于相同的连接应该是相同的......但是如果你建立不同的连接即使来自相同的 IP,您也会获得不同的选择键。
更新:我刚刚检查了我的代码,有一点非常重要:我根本没有调用 attach();我使用了 SelectableChannel.register(Selector sel, int ops, Object att)
方法。如果这样做,对 SelectionKey 上的 attachment() 的后续调用将起作用。
关于Java:SelectionKey.attach() 损坏了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1310065/
我创建了一个抽象 public interface Channel 对于java.nio.channels.SelectableChannel ,它提供了 isBidirectional方法和 get
我很好奇为什么代码总是告诉我“ key 不可写”?我的代码有什么问题吗?每次套接字读到一些内容时,我都会将键设置为对 OP_WRITE 感兴趣,并测试它是否可写。但是总是说不可写。我完全是Java套接
我正在尝试使用带有可选 channel 的 NIO 创建一个简单的服务器,并将主 NIO 循环之外的所有“重”逻辑移至单独的线程中。但我无法从其他线程注册 SelectionKey 。抱歉读得太长了。
在我的 Java NIO 实现中,我无法让 SelectionKey.attach() 工作。基本上,一旦客户端连接(OP_ACCEPT interest ops),我将它们添加到一个映射中,在该映射
下面的代码显示了一小块代码,它尝试接受来自客户端的传入连接(使用 java NIO 的典型实现),但是当我尝试从迭代器中删除 SelectionKey 时,它会抛出该异常。 这段代码看起来与 Jenk
在我的应用程序中,我使用多个线程来处理客户端连接。 我在调试时发现了一个非常奇怪的行为 - 我有一个 SelectionKey,通过调用(使用调试器)其interestOps() 方法,返回值为 1
给定 SelectableChannel c 及其 SelectionKey k,k.isWritable() 返回 channel 是否准备好接受对 write() 的调用。 但是,如果 chann
我一直致力于 Java NIO 通信并阅读有关此的各种文章。该文档说我可以“或”我感兴趣的操作。但是,我还没有看到一个例子 channel.register(selector,SelectionKey
我正在关注this tutorial关于 Java NIO。我找到了似乎正确的 java 文件 Here 。我已经调整了代码以在单个端口而不是多个端口上运行,并且只是将数据输出到屏幕而不是将其回显给客
当 SelectionKey 被取消并且下一个选择操作从键集中删除键时,是否释放了对键附件中存储的任何内容的引用? 只要没有对附加的对象进行任何其他引用,这就意味着车库收集会删除附件。 我说的对吗?
我有一个关于从 SocketChannel 读取数据的问题。假设我们有这样的东西: SelectionKey key = //; ByteBuffer b = ByteBuffer.allocateD
据我了解,服务器套接字 channel 注册为监听接受,当接受时, channel 注册为读取,一旦读取,它就注册为写入,这是通过使用interestOps方法将相关键添加到SelectionKey的
我正在使用 Java NIO 用 Java 编写一个聊天服务器。服务器毫无问题地接受连接,但任何时候 select() 在第一个客户端之后返回 > 0 时,服务器套接字始终位于选定的键集中,即使没
我见过很多JavaNio的例子。他们都在选择器线程中设置了SelectionKey的interestOps。 他们为什么这么做?在选择器线程之外的其他线程中设置SelectionKey的interes
SelectionKey 是什么意思?实例调用 interestOps(0) ?0 不是 SelectionKey 中定义的枚举值。 interestOps(0) 的作用是什么? 最佳答案 有四种操作
我的每个 SelectionKey 都需要有一个唯一的 ID。我可以使用 SelectionKeyImpl 中的一些内部 ID 吗?例如,我可以使用 FD,但我不相信每个 SelectionKey 都
我有一个方法可以打开连接、查询站点、获取页面数,然后使用 NIO 并发检索所有页面。第一个查询是使用 URLConnection 完成的,并且工作得很好。当我尝试使用 NIO 选择器和 channel
如何使 java.nio.channels.SelectionKey 对 NO opts 感兴趣? SelectionKey#cancel() 有可能,但不太好,因为它使 key 无用。 Select
现在我的服务器读取来自客户端的所有消息。现在它是一种单向通信。我想通过服务器向客户端发送消息。现在当 key 处于可读状态时服务器读取消息它没有变成可写状态我只想知道 key 何时变为可写状态。 最佳
key.cancel() 和 iterator.remove() 有什么区别?从迭代器中删除键不会也从选择器中删除键吗? 假设: ... SelectionKey key = (SelectionKe
我是一名优秀的程序员,十分优秀!