2017-09-15 90 views
0

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

此代码与Jenkov tutorial以及另一个Acceptor (line 270) SocketServer from Apache Kafka看起来非常相似。

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() 
    } 

回答

2

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

相关问题