package com.yang; import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.InetSocketAddress; import com.sun.net.httpserver.HttpExchange; 
import com.sun.net.httpserver.HttpHandler; 
import com.sun.net.httpserver.HttpServer; public class MyHTTPServer { public static void main(String[] args) { 
  try { 
   HttpServer hs = HttpServer.create(new InetSocketAddress(8888), 0);// 设置HttpServer的端口为8888 
   hs.createContext("/yang", new MyHandler());// 用MyHandler类内处理到//hujun的请求 
   hs.setExecutor(null); // creates a default executor 
   hs.start(); 
  } 
  catch (Exception e) { 
   e.printStackTrace(); 
  } 

} class MyHandler implements HttpHandler { public void handle(HttpExchange t) throws IOException { 
  InputStream is = t.getRequestBody(); 
  String response = "<font color='#ff0000'>come on baby</font>"; 
  t.sendResponseHeaders(200, response.length()); 
  OutputStream os = t.getResponseBody(); 
  os.write(response.getBytes()); 
  os.close(); 

} 以上这段经典的入门代码,不知道有没大侠在改造时,对其进行过压力测试, 
在本人的项目中,我发现HttpHandler对于请求的处理,是串行的。 
也就是每处理完一个handle(HttpExchange t),才能接受一个新的请求。 
在处理请求的过程中,对新的请求是处于阻塞状态 .
无法做到多线程的并发处理,这样也就压缩了其使用的范围。 
测试方式 在handle方法中设一个断点,让它hold住 然后,再给它一个提交,看看提交能否有返回? 
我测试过是没有的,需要等到第1个提交的内容完成后,才去处理下一个提交。 请大家试试

解决方案 »

  1.   

    HttpServer 是 JDK 6 新增的类库,还没用过呢,呵呵。
      

  2.   

    你对Executor的处理是使用的null
    hs.setExecutor(null);
    这意味着对消息的处理和新连接的接受(accept)是在同一个线程中处理的,处理是基于事件多路分离的串行方式,所以一个消息的处理要在上一个消息处理完之后才进行;而且如果有新连接连入,接受连接的操作也要和消息处理同步(串行)进行。在这种情况下要求你handler中的操作要尽快完成,才能同时应对多个连接。你如果想用多个线程并行处理多个消息,要给setExecutor传入一个线程池Executor,但也不一定是一个连接一个线程,可能是少数线程应对多数连接。