title: Why should i check channel isWritable() before write the data
body: <p>I am using a <code>ServerSocket</code> channel (NIO) on server side. My question is, what would happen if I don't check if the socketchannel is writable or not before writing data to client? I tested with a server program which worked fine without checking if the channel is ready.</p>
  
  <pre><code>public class SelectorExample {  
      public static void main (String [] args)
              throws IOException {
      // Get selector
      Selector selector = Selector.open();
  
      System.out.println("Selector open: " + selector.isOpen());
  
      // Get server socket channel and register with selector
      ServerSocketChannel serverSocket = ServerSocketChannel.open();
      //serverSocket.setOption(StandardSocketOptions.SO_REUSEADDR, true);
      InetSocketAddress hostAddress = new InetSocketAddress("localhost", 5454);
      serverSocket.socket().bind(hostAddress,0);
      serverSocket.configureBlocking(false);
      int ops = serverSocket.validOps();
      SelectionKey selectKy = serverSocket.register(selector, ops, null);
  
      for (;;) {
  
         System.out.println("Waiting for select...");
  
          int noOfKeys = selector.select();         
  
          Set selectedKeys = selector.selectedKeys();
          Iterator iter = selectedKeys.iterator();
  
          while (iter.hasNext()) {
  
              SelectionKey ky = (SelectionKey)iter.next();
  
                  ++count;
              if (ky.isAcceptable()) {
                  // Accept the new client connection
                  SocketChannel client = serverSocket.accept();
                  client.configureBlocking(false);
  
                  // Add the new connection to the selector
                client.register(selector, SelectionKey.OP_READ);
  
                 System.out.println("["+new java.sql.Timestamp(System.currentTimeMillis())+"]"+"Accepted new connection from client: " + client);
  
              }
              else if (ky.isReadable()) {                 
                  // Read the data from client
  
                  SocketChannel client = (SocketChannel) ky.channel();
                  ByteBuffer buffer = ByteBuffer.allocate(2048);
                  int i =client.read(buffer);
                  String output = new String(buffer.array());                 
                      System.out.println("Message read from client: " + output);
                  output =output.trim();
                  output=output+"\r\n";                
  
                  //*********write message here******
                  byte[] a=output.getBytes();
                  ByteBuffer bb=ByteBuffer.wrap(a);
                   client.write(bb);                   
  
                    buffer.clear();
                   System.out.println("   Sent    Message ");
                  if (i == -1) {                  
                      client.close();
                     System.out.println("Client messages are complete; close.");
                  }
  
              } // end if (ky...)
              //countkey++;
              iter.remove();                  
          } // end while loop
  
      } // end for loop
  }
  </code></pre>
  
  <p>}</p>