当前位置: 首页 > 知识库问答 >
问题:

NIO选择器持续触发没有数据的读操作

刘绍晖
2023-03-14

我有一个自定义的NIO服务器,但我看到了一个我无法再现也无法解释的行为:选择器不断用isreadable()==true触发某个选择键,但当我从通道读取时,没有数据。

我有:

  • 三次检查EOS是否在所有方案中都得到遵守
  • 构建了自定义客户端,这些客户端尝试各种无效数据的古怪组合来触发bug,但自己却无法触发它
  • 查看apache mina代码,看看它们与我的服务器相比是否有什么特别之处
  • 尝试了不同版本的JDK(8_111和8_121)
  • 三重检查选择键是否从finally块中的选定键集的迭代器中删除,该块环绕iterator.next()之后的所有内容,因此它不应该是ghost键

所有的东西都是空的,我在客户端尝试的每一个奇怪的事情都被服务器正确地处理了,但尽管如此,大约每四个小时(你几乎可以为它设置一个时钟),一个来自俄罗斯的IP连接到服务器并触发了bug。

此时,选择器进入过驱动状态,连续触发通道和与之相连的读取进程,这将持续报告0字节传入。

所以有两个问题:

    null

更新:

  • 触发读取的不是服务器套接字通道,而是接受的客户端通道之一,因此它不能(不应该吗?)是传入连接
  • 默认情况下,仅注册OP_READ,如果内部缓冲区仍包含数据,则偶尔注册OP_WRITE
  • 提到的读取超时是自定义超时,解析器将跟踪消息的第一个数据何时进入,如果完成时间过长,它将触发读取超时

如果我知道问题出在哪里,我可以提供这部分的一些代码,但是整个服务器太大了,无法粘贴在这里。

selectionKey.isReadable() + "/" + selectionKey.isValid() + "/" + selectionKey.channel().isOpen()

所有三个布尔函数都是真的。

共有1个答案

南宫博简
2023-03-14

如果没有一些代码,不可能正确地回答这个问题,但是:

除了实际数据和EOS之外,还有什么可以触发选择器上的读操作呢?

如果是ServerSocketChannel,则为传入连接。

不。在你的代码中找到错误。

存在读取超时

在非阻塞套接字上不能存在读取超时,并且当您使用选择器时,您必须使用非阻塞套接字。

 类似资料:
  • 我有连接到我的数据库运行。我可以执行以下没有问题: 然而,在设置了JPA和持久类之后,我总是得到一个“未选择数据库”错误。看起来我不需要调整我的数据库配置(MySQL连接到Glassfish 3.1),否则上面的代码将无法工作。 正在拨打的电话: 我尝试过这个调用直接在MySQL工作台和它不工作。 这一个确实有效: 我一直在玩游戏,似乎无法在任何地方添加数据库名称(“人”)。以下是我目前掌握的情况

  • 主要内容:1 为什么要使用选择器?,2 创建一个选择器,3 向选择器注册频道,4 选择键,5 通过选择器选择频道,6 wakeup()方法,7 close()方法,8 完整的选择器示例Java NIO的选择器(Selector)是一个组件,可以选择一个或多个通道(Channel) 实例,并确定准备好进行读取或写入的通道。这样,单个线程可以管理多个通道(Channel),从而可以管理多个网络连接。 1 为什么要使用选择器? 仅使用单个线程来处理多个通道的优点是您需要更少的线程来处理通道。实际上,您

  • 对开源 CI 服务器:CruiseControl、Luntbuild 和 Continuum 的调查 由于有许多持续集成服务(CI)服务器可以选择,所以很难决定哪个适应自己。在 让开发自动化 系列的第二篇文章中,开发自动化专家 Duvall 采用一致的评估标准和很多说明性示例,介绍了一些开源 CI 服务器,包括 Continuum、CruiseControl 和 Luntbuild。 在我脑海里,

  • 我有一个Primeface应用程序,其中我启动了一个包含表单的对话框。对话框有一个保存/取消按钮对。在这个对话框中,我无法调用on完成、onstart等方法。我在其他回复中看到原因是没有执行AJAX。但是,我不知道这种情况下的原因,因为命令按钮的类型是提交,并且应该有ajax="true"(默认情况下)。有人能在里面放一点光吗? 我的xhtml: 这是我的后盾: 谢谢!

  • 问题内容: 我想在下面的HTML片段中选择BONKERS。它的区别在于,它是单独存在的,而其所有兄弟姐妹都包含。是显而易见的选择,但由于文本节点而无法使用。我以为我知道这些东西,但这正驱使我疯狂。 我需要一个纯CSS解决方案(不能选择JS),并且无法控制源HTML。 ! 问题答案: 您可以按照这种方法。通过所需的CSS 设置元素的样式,然后重置可在样式中继承的CSS样式,即: CSS: 您可能不需

  • 问题内容: 我在没有选择器的情况下在Kubernetes的服务中苦苦挣扎。群集通过kops安装在AWS上。我有一个带有3个Nginx Pod的部署,暴露了端口80: 创建部署后,我记下了IP地址: 并创建了一个服务于IP地址的服务: 服务已成功创建: 不幸的是,我尝试通过服务从相同名称空间的另一个Pod连接到Nginx失败: 我可以直接成功地连接到Nginx Pod: 我注意到我的服务没有任何端点