Http系列一:通过Oracle HttpServer构建HTT
2020-11-15 本文已影响0人
我知他风雨兼程途径日暮不赏
代码github地址:https://github.com/LynHB/ProjectA/blob/master/src/main/java/study/http/HttpServerDemo.java
1. HttpServer类说明
1.1 介绍
该类实现了一个简单的HTTP服务器。HttpServer被绑定到一个IP地址和端口号,并侦听这个地址上来自Client的传入TCP连接。子类HttpsServer实现了一个处理HTTPS请求的服务器。
为了处理请求,一个或多个HttpHandler
对象必须与服务器相关联。每个这样的HttpHandler
都注册了一个根URI路径
,该路径表示应用程序或服务在该服务器上的位置。处理程序到HttpServer
的映射由HttpContext
对象封装。HttpContexts
是通过调用createContext(String,HttpHandler)
来创建的。任何找不到处理程序的请求都将以404响应被拒绝。线程的管理可以通过提供Executor对象在此对象外部完成。如果没有提供,则使用默认提供。
1.2 常用方法
方法名 | 返回类型 | 方法说明 |
---|---|---|
bind(InetSocetAddr addr, int backlog) | void | 给未进行IP和端口绑定的HttpServer进行绑定,并可设置backlog |
create() | HttpServer | 创建一个HttpServer实例,但是未进行初始化和未绑定对应本地地址和端口,需要结合bind(InetSocetAddr addr, int backlog)使用 |
create(InetSocetAddr addr, int backlog) | HttpServer | 创建对应实例,绑定IP和端口信息,并指定backlog数 |
createContext(String path,HttpHandler handle) | HttpContext | 通过URI绑定对应的handle控制器,创建HTTP上下文。 |
getAddress() | InetSocketAddress | 返回HttpServer相关绑定信息 |
getExecutor() | Executor | 获取线程池对象,通过setExecutor(Executor)设置,如果没设置返回null |
start | void | 在新的后台线程中启动此服务器。 |
stop | void | 通过关闭监听套接字并禁止处理任何新的exchange来停止此服务器。 |
1.3 简单的Demo
即可使用localhost:8888 进行访问。
/*
实现HttpHandle处理Http请求
*/
public class HttpServerDemo implements HttpHandler {
public static void main(String[] args) throws IOException {
// 绑定本地指定8888
HttpServer httpServer = HttpServer.create(new InetSocketAddress(InetAddress.getByName("0.0.0.0"),8888),0);
// 设置上下文信息
httpServer.createContext("/",new HttpServerDemo());
// 启动服务
httpServer.start();
}
@Override
public void handle(HttpExchange httpExchange) throws IOException {
String response = httpExchange.getRequestURI()+":test message";
httpExchange.sendResponseHeaders(200, 0);
OutputStream os = httpExchange.getResponseBody();
os.write(response.getBytes(StandardCharsets.UTF_8));
os.close();
}
}