2017-09-15 3 views
0

下のコードは、クライアントからの接続を受け入れるための小さなチャンクを示しています(Java NIOの典型的な実装です)。しかしSelectionKey Iteratorから例外がスローされます。イテレータからSelectionKeyを削除しようとすると、UnsupportedOperationExceptionがスローされます

このコードは、Jenkov tutorialと非常によく似ており、この1つは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を持っている)

によって返されます
関連する問題