title: Why do I get a CancelledKeyException?
body: <p>Why do I get an error of Cancelled Key Exception? Can anyone please help me? What part of the code of the client went wrong?</p>
  
  <pre><code>java.nio.channels.CancelledKeyException
  at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:73)
  at sun.nio.ch.SelectionKeyImpl.interestOps(SelectionKeyImpl.java:82)
  at viaNIO.clientasync2.write(clientasync2.java:130)
  at viaNIO.clientasync2.run(clientasync2.java:53)
  at java.lang.Thread.run(Thread.java:745)
  
  java.nio.channels.CancelledKeyException
  at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:73)
  at sun.nio.ch.SelectionKeyImpl.readyOps(SelectionKeyImpl.java:87)
  at java.nio.channels.SelectionKey.isReadable(SelectionKey.java:289)
  at viaNIO.clientasync2.run(clientasync2.java:55)
  at java.lang.Thread.run(Thread.java:745)
  </code></pre>
  
  <p>Here is the code for the Client:</p>
  
  <pre><code>        while (!Thread.interrupted()) {
  
              selector.select();
  
              Iterator&lt;SelectionKey&gt; keys = selector.selectedKeys().iterator();
  
              while (keys.hasNext()) {
                  SelectionKey key = keys.next();
                  keys.remove();
  
                  if (key.isValid()) {
                      if (key.isConnectable()) {
                          System.out.println("Connected to the server");
                          connect(key);
                      }
                      if (key.isWritable()) {
                          System.out.println("Writing to the server");
                          write(key);
                      }
                      if (key.isReadable()) {
                          System.out.println("Reading from the server");
                          read(key);
                      }
                  }
              }
          }
  </code></pre>
  
  <p>Here is the updated Code:</p>
  
  <pre><code>   while (!Thread.interrupted()) {
  
              selector.select();
  
              Iterator&lt;SelectionKey&gt; keys = selector.selectedKeys().iterator();
  
              while (keys.hasNext()) {
                  SelectionKey key = keys.next();
                  keys.remove();
  
                  if (key.isValid() &amp;&amp; key.isConnectable()) {
                      connect(key);
                  } else {
                      if (key.isValid() &amp;&amp; key.isWritable()) {
                          System.out.println("Writing to the server");
                          write(key);
                      }
                      if (key.isValid() &amp;&amp; key.isReadable()) {
                          System.out.println("Reading from the server");
                          read(key);
                      }
                  }
              }
          }
  </code></pre>
  
  <p>This is also my code for the write method</p>
  
  <pre><code> private void write(SelectionKey key) throws IOException {
      SocketChannel socket = (SocketChannel) key.channel();
      RandomAccessFile aFile = null;
      try {
          File f = new File("D:/test.rar");
          aFile = new RandomAccessFile(f, "r");
          ByteBuffer buffer = ByteBuffer.allocate(300000000);
  
          FileChannel inChannel = aFile.getChannel();
          while (inChannel.read(buffer) &gt; 0) {
              buffer.flip();
              socket.write(buffer);
              buffer.clear();
          }
          aFile.close();
          socket.close();
          inChannel.close();
          Thread.sleep(1000);
  
          key.interestOps(SelectionKey.OP_READ);
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
  </code></pre>
  
  <p>The code for the read method</p>
  
  <pre><code>  private void read(SelectionKey key) throws IOException {
      SocketChannel channel = (SocketChannel) key.channel();
      ByteBuffer readBuffer = ByteBuffer.allocate(1000);
      readBuffer.clear();
      int length;
      try {
          length = channel.read(readBuffer);
      } catch (IOException e) {
          System.out.println("Reading problem, closing connection");
          key.cancel();
          channel.close();
          return;
      }
      if (length == -1) {
          System.out.println("Nothing was read from server");
          channel.close();
          key.cancel();
          return;
      }
      readBuffer.flip();
      byte[] buff = new byte[1024];
      readBuffer.get(buff, 0, length);
      System.out.println("Server said: " + new String(buff));
      if (readCnt != 1) {
          key.interestOps(SelectionKey.OP_WRITE);
          readCnt++;
      } else {
          key.cancel();
          close();
      }
  }
  </code></pre>
  
  <p>The code for the connect method</p>
  
  <pre><code> private void connect(SelectionKey key) throws IOException {
      SocketChannel channel = (SocketChannel) key.channel();
      if (channel.isConnectionPending()) {
          channel.finishConnect();
      }
      channel.configureBlocking(false);
      channel.register(selector, SelectionKey.OP_READ);
  }
  </code></pre>