This Java tip shows how to read a web server response using nonblocking
channels in Java.

Java Code:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.Set;

public class GetWebPageApp {
  static Selector selector;

  public static void main(String args[]) throws Exception {
    String resource, host, file;
    int slashPos;

    resource = "www.java-forums.org"; // skip HTTP://
    slashPos = resource.indexOf('/'); // find host/file separator
    if (slashPos < 0) {
      resource = resource + "/";
      slashPos = resource.indexOf('/');
    }
    file = resource.substring(slashPos); // isolate host and file parts
    host = resource.substring(0, slashPos);
    System.out.println("Host to contact: '" + host + "'");
    System.out.println("File to fetch : '" + file + "'");

    SocketChannel channel = null;

    try {
      Charset charset = Charset.forName("ISO-8859-1");
      CharsetDecoder decoder = charset.newDecoder();
      CharsetEncoder encoder = charset.newEncoder();

      ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
      CharBuffer charBuffer = CharBuffer.allocate(1024);

      InetSocketAddress socketAddress = new InetSocketAddress(host, 80);
      channel = SocketChannel.open();
      channel.configureBlocking(false);
      channel.connect(socketAddress);

      selector = Selector.open();

      channel.register(selector, SelectionKey.OP_CONNECT
          | SelectionKey.OP_READ);

      while (selector.select(500) > 0) {
        Set readyKeys = selector.selectedKeys();
        try {
          Iterator readyItor = readyKeys.iterator();

          while (readyItor.hasNext()) {

            SelectionKey key = (SelectionKey) readyItor.next();
            readyItor.remove();
            SocketChannel keyChannel = (SocketChannel) key
                .channel();

            if (key.isConnectable()) {
              if (keyChannel.isConnectionPending()) {
                keyChannel.finishConnect();
              }
              String request = "GET " + file + " \r\n\r\n";
              keyChannel.write(encoder.encode(CharBuffer
                  .wrap(request)));
            } else if (key.isReadable()) {
              keyChannel.read(buffer);
              buffer.flip();

              decoder.decode(buffer, charBuffer, false);
              charBuffer.flip();
              System.out.print(charBuffer);

              buffer.clear();
              charBuffer.clear();

            } else {
              System.err.println("Unknown key");
            }
          }
        } catch (ConcurrentModificationException e) {
        }
      }
    } catch (UnknownHostException e) {
      System.err.println(e);
    } catch (IOException e) {
      System.err.println(e);
    } finally {
      if (channel != null) {
        try {
          channel.close();
        } catch (IOException ignored) {
        }
      }
    }
    System.out.println("\nDone.");
  }
}