这只是一个简单的示例,如果你想了解HTTP的详细内容可参考我的一个开源项目JQuickDown
/* * Created on 2005-2-1 * * CopyRight by lxleaves_zhang */ package test;
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.nio.channels.spi.SelectorProvider; import java.util.Iterator;
public class NIOTest { public static SocketChannel createSocketChannel(String host, int port) throws IOException { SocketChannel sc = SocketChannel .open(new InetSocketAddress(host, port)); sc.configureBlocking(false); return sc; }
public static final String host = "www.163.com";
public static final String path = "/";
public static final int port = 80;
public static final byte[] req = ("GET " + path + " HTTP/1.0\r\nHost:" + host + "\r\n\r\n").getBytes();
public static void main(String[] args) { Selector sel = null; ByteBuffer buf = ByteBuffer.allocate(256); SocketChannel sc[] = new SocketChannel[2]; try { sel = SelectorProvider.provider().openSelector(); sc[0] = createSocketChannel(host, port); sc[1] = createSocketChannel(host, port); buf.put(req); buf.flip(); sc[0].write(buf); buf.flip(); sc[1].write(buf); sc[0].register(sel, sc[0].validOps()); sc[1].register(sel, sc[1].validOps()); } catch (IOException e) { e.printStackTrace(); } while (sel.isOpen()) { try { sel.select(); } catch (IOException e) { e.printStackTrace(); } Iterator it = sel.selectedKeys().iterator(); while (it.hasNext()) { SelectionKey sk = (SelectionKey) it.next(); it.remove(); SocketChannel next = (SocketChannel) sk.channel(); buf.clear(); try { // check whether finish if (next.read(buf) == -1) { sk.cancel(); next.close();
if (!it.hasNext()) { sel.close(); } } } catch (IOException e) { e.printStackTrace(); } buf.flip(); if (buf.limit() == 0) continue; byte b[] = new byte[buf.limit()]; buf.get(b); // System.out.println(next == sc[0]); if (next == sc[0]) System.out.print(new String(b)); else System.err.print(new String(b)); } } } }

|