Open crazyjohn opened 9 years ago
这篇分析一下sun的jdk自带的http服务器,HttpServer。 1. 掀起头帘:api
这篇分析一下sun的jdk自带的http服务器,HttpServer。
首先来看看如何使用它,看码:
package com.stone.core.http; import java.io.IOException; import java.net.InetSocketAddress; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; /** * Test sun's http server; * * @author crazyjohn * */ public class HttpServerApi { public static void main(String[] args) throws IOException { // create server HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 8888), 100); // create context server.createContext("/test", new HttpHandler() { @Override public void handle(HttpExchange exchange) throws IOException { String body = "This is sun's htttp server."; response(exchange, body.getBytes("UTF-8")); System.out.println("Test handler."); } }); // start server server.start(); } /** * Do response; * * @param exchange * @param datas * @throws IOException */ protected static void response(HttpExchange exchange, byte[] datas) throws IOException { exchange.sendResponseHeaders(200, datas.length); exchange.getResponseBody().write(datas); exchange.getResponseBody().close(); } }
启动以后,进程进入工作状态。在浏览器中输入:http://localhost:8888/test然后就会看到网页端的输出:
http://localhost:8888/test
这样它的工作就奏效了。
看结构图:
HttpServer模块。它本身对外的接口很少。
start,stop方法。这都是生命周期相关的方法。
它内部正真在工作的其实是一个ServerImpl对象,外部对httpServer接口的调用都会委托给ServerImpl来实现,所以从这个意义上来说,HttpServer只是一个facade门面,用来封装出一组容易操作的接口。
ServerImpl。上头说到的HttpServer的几乎所有工作都会委托给这个类来进行,HttpServer聚合一个ServerImpl。它内部有两个核心组件,一个是selector,用来通过select方法来收集需要进行read和write的连接。其二是dispatcher,这是一个Runnable,它封装了ServerImpl的核心工作流。
HttpExchange。这个对象是对http请求的封装,可以通过getRequestURI接口来获取URI对象,进而进一步获取path和query查询信息。通过getResponseBody接口获取输出流,进行响应内容的设置等。
HttpContext。通过HttpServer的public abstract HttpContext createContext(String paramString, HttpHandler paramHttpHandler);接口创建。是个很简单的上下文类,接口也很简单,可以从其中获取路径path和Handler。
public abstract HttpContext createContext(String paramString, HttpHandler paramHttpHandler);
这里说的是httpserver的核心工作流程,看这里就很了然了。
研究下看看httpserver的线程结构。
首先来看看如何使用它,看码:
启动以后,进程进入工作状态。在浏览器中输入:
http://localhost:8888/test
然后就会看到网页端的输出:这样它的工作就奏效了。
2. 仔细打量:结构分析
看结构图:
HttpServer模块。它本身对外的接口很少。
start,stop方法。这都是生命周期相关的方法。
它内部正真在工作的其实是一个ServerImpl对象,外部对httpServer接口的调用都会委托给ServerImpl来实现,所以从这个意义上来说,HttpServer只是一个facade门面,用来封装出一组容易操作的接口。
ServerImpl。上头说到的HttpServer的几乎所有工作都会委托给这个类来进行,HttpServer聚合一个ServerImpl。它内部有两个核心组件,一个是selector,用来通过select方法来收集需要进行read和write的连接。其二是dispatcher,这是一个Runnable,它封装了ServerImpl的核心工作流。
HttpExchange。这个对象是对http请求的封装,可以通过getRequestURI接口来获取URI对象,进而进一步获取path和query查询信息。通过getResponseBody接口获取输出流,进行响应内容的设置等。
HttpContext。通过HttpServer的
public abstract HttpContext createContext(String paramString, HttpHandler paramHttpHandler);
接口创建。是个很简单的上下文类,接口也很简单,可以从其中获取路径path和Handler。3. 仔细打量:时序分析
这里说的是httpserver的核心工作流程,看这里就很了然了。
4. 线程结构
研究下看看httpserver的线程结构。