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 = "come on baby";
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
以上这段经典的入门代码,不知道有没大侠在改造时,对其进行过压力测试,
在本人的项目中,我发现HttpHandler对于请求的处理,是串行的。
也就是每处理完一个handle(HttpExchange t),才能接受一个新的请求。
在处理请求的过程中,对新的请求是处于阻塞状态
无法做到多线程的并发处理,这样也就压缩了其使用的范围。
请大家拍砖
[quote]但你试试 在handle中设一个断点,让它hold住 然后,再给它一个提交,看看提交能否有返回?
我测试过是没有的,需要等到第1个提交的内容完成后,才去处理下一个提交[/quote]
你的handle本身就是单线程的,它当然只能顺序处理多个请求。你需要在handle里面启动新的线程去处理得到的socket,这个线程的hold就不会影响其他的线程了。
你的MyHandler应该启动多线程去处理,而不是自己处理。MyHandler现在是自己处理了。
没用过,但猜测应该不是阻塞的。
ServerSocket接受到一个socket(客户端请求)后,肯定是启动一个新的线程去处理该socket。
你的MyHandler应该负责干这件事情(启动多线程去处理,而不是自己处理)。
[size=large]不知道楼主现在有没有解决这个问题?最近本人也在研究这个jdk 原生的httpserver类,在写测试用例的时候发现,客户端通过循环开启线程访问端口的形式来访问服务端,线程数为200时,服务端返回数据很慢,不一会儿电脑内存就飙红了。刚才看到有人回答handler内开线程处理,不怎么明白,有大神可以详细解释一下吗?[/size]