Servlet API 和 NIO: 最终组合在一起
2009-11-08 00:00:00 来源:WEB开发网
清单 3. RequestHandlerThread.javapublic void run() {
while (true) {
Client client = (Client) myQueue.remove();
try {
for (; ; ) {
HttpRequest req = new HttpRequest(client.clientInputStream,
myServletContext);
HttpResponse res = new HttpResponse(client.key);
defaultServlet.service(req, res);
if (client.notifyRequestDone())
break;
}
} catch (Exception e) {
client.key.cancel();
client.key.selector().wakeup();
}
}
}
然后该线程创建新的 HttpRequest 和 HttpResponse 实例,并调用 defaultServlet 的 service 方法。注意, HttpRequest 是用 Client 对象的 clientInputStream 属性构造的。 PipedInputStream 就是负责把非阻塞 I/O 转换成阻塞流。
从现在开始,请求处理就与您在 J2EE Servlet API 中期望的相似。当对 servlet 的调用返回时,工作线程在返回到池中之前,会检查是否有来自相同客户机的另一个请求可用。注意,这里用到了单词 池 (pool)。事实上,线程会对队列尝试另一个 remove() 调用,并变成阻塞,直到下一个请求可用。
运行示例
示例服务器实现了 HTTP 1.1 协议的一个子集。它处理普通的 HTTP get 请求。它带有两个命令行参数。第一个指定端口号,第二个指定 HTML 文件所驻留的目录。在解压文件后, 切换到项目目录,然后执行下面的命令,注意要把下面的 webroot 目录替换为您自己的目录:
更多精彩
赞助商链接