Reading Web Pages with Nonblocking Channels : Web Server Client « Network Protocol « Java






Reading Web Pages with Nonblocking Channels

Reading Web Pages with Nonblocking Channels

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.java2s.com/index.htm"; // 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.");
  }
}
           
       








Related examples in the same category

1.Java HTTP/HTTPS Server Based on new io
2.Connect with a Web serverConnect with a Web server
3.Reading URLs Protected with HTTP Authentication
4.Reading Web Pages with StreamsReading Web Pages with Streams
5.Reading Web Pages, with Socket ChannelsReading Web Pages, with Socket Channels
6.A Simple Web ServerA Simple Web Server
7.Web server
8.Save binary file from web