Mega Code Archive

 
Categories / Java / Network Protocol
 

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.rntsoft.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.");   } }