javanio包粘贴

javanio包粘贴,java,selector,nio,readable,Java,Selector,Nio,Readable,我有一个带有选择器的NIO实现的服务器。 实现起来相当简单: selector.select(); Set<SelectionKey> keys = selector.selectedKeys(); for (SelectionKey key : keys) { if (! key.isValid()) { continue;

我有一个带有选择器的NIO实现的服务器。 实现起来相当简单:

            selector.select();
            Set<SelectionKey> keys = selector.selectedKeys();
            for (SelectionKey key : keys) {
                if (! key.isValid()) {
                    continue;
                }
                UserConnection connection = users.get(key);
                if (key.isReadable()) {
                    processReadableKey(key, connection);
                } else if (key.isWritable()) {
                    processWritableKey(key, connection);
                }
问题是,当两个数据包消息几乎立即一个接一个地到达时,选择器会做出反应并处理第一个数据包,但随后它不会做出反应并将相应的键标记为可读以处理第二个数据包。 当下一条消息到达时,选择器处理它,然后处理丢失的数据包。 我不知道,怎么修。我尝试减少通道缓冲区,并尝试逐个selector.wakeup唤醒选择器,但没有帮助,因为问题在于在hanling夫妇中的第一条消息后立即将密钥识别为可读。
有什么想法吗?

听起来您需要先从所选关键点集中删除选择关键点,然后再使用它们。如果不这样做,当您调用selectedKeys时,返回的集合仍将包含旧的、使用过的密钥

大致如下:

 Iterator iter = selector.selectedKeys().iterator();  
 while (iter.hasNext()) {  
     SelectionKey key = (SelectionKey) iter.next();  
     iter.remove();  // remove here 
     process(key);  
 }

我确实删除了它们,但我并没有粘贴所有的选择器代码。问题已经解决,是客户的问题。客户端也有一个选择器和一个要发送的消息列表。将消息添加到列表后,我调用selector.wakeup,但如果消息很大,selector似乎只写入第一条消息,直到nest调用。这不是正确的分析。选择器不写入任何内容。写作方法就是写作的目的。你认为你已经写了一些东西,但你没有。众所周知,nio代码很难完全正确。这是一个非常棘手的api。除非类需要这样做,否则我会使用netty这样的框架,它将复杂性隐藏在幕后。你确定有两包真的到了吗?