HTTP协议的下层使用的是tcp。所以我们建立一个tcp连接就能发送接收http请求。dawn底层使用了nio。可是经过dawn的封装之后,我们在编写代码的时候,就和使用普通的堵塞式socket一样

,不须要关注nio的api。

能够把我们的精力放在业务逻辑的处理上。举比例如以下。下例的功能就是取回baidu首页:

package zhmt.dawn.nio;

import java.nio.charset.Charset;

import zhmt.dawn.nio.buffer.ScalableDirectBuf;
import kilim.Pausable;
import kilim.Scheduler;
import kilim.Task;

public class SimpleHttp extends Task {
	public static void main(String[] args) {
		Scheduler sch = new Scheduler();
		sch.start();

		SimpleHttp task = new SimpleHttp();
		task.startOn(sch);
	}

	/**
	 * 自己要清楚。这段代码是在调度器中运行的
	 */
	@Override
	public void execute() throws Pausable, Exception {
		//创建buffer
		ScalableDirectBuf buf = ScalableDirectBuf.allocateFromTlsCache();

		//准备http请求数据。这里是訪问首页
		byte[] req = "GET / HTTP/1.0\r\n\r\n".getBytes();
		buf.wbytes(req, 0, req.length);

		//创建连接
		TcpClientChannel ch = new TcpClientChannel("www.baidu.com", 80, false);

		//发送http请求
		ch.writeAll(buf);

		//接收全部响应数据,直到收到EOF,由于这里用的是HTTP1.0,所以,非常快就能收到EOF
		int n = ch.readSome(buf);
		while (n >= 0) {
			n = ch.readSome(buf);
		}

		//把结果转成字符串。并打印
		String ret = buf.rstr((int) buf.readable(), Charset.forName("utf8"));
		System.out.println("===========================");
		System.out.println(ret);
		System.out.println("===========================");

		//释放buffer
		buf.release();
		//关闭连接
		ch.close();
	}
}

这个程序,非常直观。我就不多解释了。也能够到github下载源代码:

https://github.com/zhmt/dawn/blob/master/examples/zhmt/dawn/nio/SimpleHttp.java


下一篇。我们写个简单的服务,一个简单的聊天室server。