0

下面的代码显示了一小段代码,它尝试接受来自客户端的传入连接(使用 java NIO 的典型实现),但是当我尝试从迭代器中删除 SelectionKey 时,它会抛出该异常。

此代码与Jenkov 教程和来自 Apache Kafka 的另一个Acceptor(第 270 行)SocketServer看起来非常相似。

  override def run(): Unit = {

    this.logger.info("Acceptor started.")

    super.run()

    this.serverSocketChannel.register(this.selector, SelectionKey.OP_ACCEPT)

    while (this.isRunning) {

      val readyKeys = this.selector.select(500)

      if (readyKeys > 0) {

        val selectedKeys = this.selector.keys()

        val selectionKeysIterator = selectedKeys.iterator()

        while (selectionKeysIterator.hasNext && this.isRunning) {

          val selectionKey = selectionKeysIterator.next()

          selectionKeysIterator.remove()

          if (!selectionKey.isAcceptable)
            throw new IllegalStateException("The SelectionKey is not on the valid state [Acceptable].")

          this.accept(selectionKey)
        }
      }
    }

    this.selector.close()
  }
4

1 回答 1

2

选择键集由 selector.selectedKey 返回(您有 selector.keys 指定为不可修改)

于 2017-09-15T17:16:28.403 回答