WEB开发网
开发学院软件开发Java Servlet API 和 NIO: 最终组合在一起 阅读

Servlet API 和 NIO: 最终组合在一起

 2009-11-08 00:00:00 来源:WEB开发网   
核心提示: 清单 3. RequestHandlerThread.javapublicvoidrun(){while(true){Clientclient=(Client)myQueue.remove();try{for(;;){HttpRequestreq=newHttpRequest(client.cl


清单 3. RequestHandlerThread.java
public 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 目录替换为您自己的目录:

上一页  1 2 3 4 5 6 7  下一页

Tags:Servlet API NIO

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接