首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java NIO包粘连

Java NIO包粘连
EN

Stack Overflow用户
提问于 2015-05-04 05:06:00
回答 1查看 102关注 0票数 1

我有一个服务器与NIO实现选择器。实现相当简单:

代码语言:javascript
复制
            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第一条消息后立即识别密钥为“可读”有关。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-05-04 05:29:34

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

大致是这样的:

代码语言:javascript
复制
 Iterator iter = selector.selectedKeys().iterator();  
 while (iter.hasNext()) {  
     SelectionKey key = (SelectionKey) iter.next();  
     iter.remove();  // remove here 
     process(key);  
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30019392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档