Java处理http协议相关初步(二)――httpserver (一)

2014-11-24 07:45:54 · 作者: · 浏览: 1

这里的HttpServer,并不是哪里专门下载的类库了,而是在JDK1.6中自带的,在com.sun.net.httpserver包中,提供了简单的较高层次意义上的Http ServerAPI,可以构建内置的HTTP Server,支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API来实现。程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给HttpHandler实现类的回调方法. (摘过来的,也是官方的描述说明)
通过下面使用一个简单的例子,就可以看到怎么使用它们了,详细的功能可以查看API文档。访问localhost:8086/ 和 localhost:8086/test看看
[java]

package com.test.myjava; 

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.Queue;
import java.util.concurrent.*;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class HttpServerTest {
public static void main(String[] args) {
try {
//允许最大连接数
int backLog = 10;
InetSocketAddress inetSock = new InetSocketAddress(8086);
HttpServer httpServer = HttpServer.create(inetSock, backLog);
//直接返回Hello.....
httpServer.createContext("/", new HandlerTestA());
//显示已经处理的请求数,采用线程池
httpServer.createContext("/test",new HandlerTestB());
httpServer.setExecutor(null);
httpServer.start();
System.out.println("HttpServer Test Start!");
} catch (Exception e) {
e.printStackTrace();
}
}
}

//直接处理请求
class HandlerTestA implements HttpHandler{

public void handle(HttpExchange httpExchange) throws IOException {
// TODO Auto-generated method stub
//针对请求的处理部分
//返回请求响应时,遵循HTTP协议
String responseString = "Hello! This a HttpServer!";
//设置响应头
httpExchange.sendResponseHeaders(200, responseString.length());
OutputStream os = httpExchange.getResponseBody();
os.write(responseString.getBytes());
os.close();
}

}
//线程池还不会用,简略的使用了下,意思有点差距,后面在分析
class HandlerTestB implements HttpHandler{
private static int requestNum = 0;
ThreadPoolExecutor threadPoolExecutor;
HandlerTestB(){
//两个常在线程,最大3个
threadPoolExecutor = new ThreadPoolExecutor(2,3, 30,
TimeUnit.SECONDS,
new ArrayBlockingQueue(2),
new ThreadPoolExecutor.CallerRunsPolicy()
);
}
public void handle(HttpExchange he) throws IOException {
// TODO Auto-generated method stub
if((getQueueSize(threadPoolExecutor.getQueue()))<2){
RequestTasks rqt = new RequestTasks(he);
threadPoolExecutor.execute(rqt);
}
else System.out.println("Please Wait!");
}
private synchronized int getQueueSize(Queue queue)
{
return queue.size();
}

}

//处理请求的任务
class RequestTasks implements Runnable{

static int processedNum = 0;
HttpExchange httpExchange;
RequestTasks(HttpExchange he){
httpExchange = he;
processedNum++;
}
public void run() {
// TODO Auto-generated method stub
System.out.println("ProcessedNum:" +processedNum);
St