HttpServer是JDK1.6以后内置的HTTP服务器,位置在rt.jar的com.sun.net.httpserver包下。
使用HttpServer实现HTTP服务器主要涉及下面几个类:
1.HttpServer:表示一个服务器实例,需要绑定一个IP地址和端口号。(HttpsServer是其子类,处理https请求)
2.HttpContext:服务器监听器的上下文,需要配置用于匹配URI的公共路径和用来处理请求的HttpHandler
(可以创建多个 HttpContext,一个 HttpContext 对应一个 HttpHandler,不同的 URI 请求,根据添加的 HttpContext 监听器,分配到对应的 HttpHandler 处理请求)
3.HttpHandler:上下文对应的http请求处理器
4.HttpExchange:监听器回调时传入的参数,封装了http请求和响应的所有数据操作
在使用eclipse创建项目时,如果添加httpserver的包时显示找不到httpserver包是因为sun.net包里的类eclipse默认禁止使用。
解决方法:
工程上右键->工程属性->java builder path->Libraries标签,点击JRE System Library里面的Access rules,添加 com/sun/net/httpserver/*** 为accessible,如果该项存在,就edit
Demo代码:
package httpservice;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpServer;
public class MyHttpService {
//启动后访问:http://localhost:8888/test
public static void main(String[] args) throws Exception {
*//创建http服务器,绑定本地8888端口*
HttpServer httpServer = HttpServer.create(new InetSocketAddress(8888), 0);
*//创建上下文监听,拦截包含/test的请求*
httpServer.createContext("/test", new TestHttpHandler());
httpServer.start();
}
}
package httpservice;
import java.io.IOException;
import java.io.OutputStream;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
public class TestHttpHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
String response = "test message";
exchange.sendResponseHeaders(200, 0);
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes("UTF-8"));
os.close();
}
}
1.HttpServer 常用方法:
// 重新绑定地址和端口
void bind(InetSocketAddress addr, int backlog)
// 获取当前绑定的地址
InetSocketAddress getAddress()
/**
* 创建监听的上下文, 请求 URI 根路径的匹配, 根据不同的 URI 根路径选择不同的 HttpHandler 处理请求,
* 路径必须以 "/" 开头。路径 "/" 表示匹配所有的请求 URI(没有其他更具体的匹配路径除外)。
*/
HttpContext createContext(String path)
HttpContext createContext(String path, HttpHandler handler)
// 移除上下文监听
void removeContext(HttpContext context)
void removeContext(String path)
// 设置请求的线程执行器, 设置为 null 表示使用默认的执行器
void setExecutor(Executor executor)
Executor getExecutor()
// 启动服务
void start()
// 最长等待指定时间后停止服务
void stop(int delay)
2.HttpContext
HttpServer httpServer = HttpServer.create(...);
/*
* 上下文监听器对应的 URI 根路径,必须以 "/" 开头,
* 表示以 "/xxx" 开头的 URI 请求都交给对应的 httpHandler 处理,
* "/" 表示匹配所有的请求, 一个请求只会交给 path 最匹配的一个上下文去处理(不能重复处理)
*/
String path = "/xxx";
// 可以创建多个,以实现更细致的 URI 路径匹配来分开处理来自不同 URI 路径的请求
httpServer.createContext(path, new HttpHandler() {
@Override
public void handle(HttpExchange httpExchange) throws IOException {
// 处理匹配当前上下文 path 的请求
}
});
3.HttpHandler ( HttpExchange )
// 获取请求的 URI, 请求链接除去协议和域名端口后的部分, 如: http://www.abc.com/aa/bb, URI 为 /aa/bb
URI getRequestURI()
// 获取请求客户端的 IP 地址
InetSocketAddress getRemoteAddress()
// 获取请求协议, 例如: HTTP/1.1
String getProtocol()
// 获取请求的方法, "GET", "POST" 等
String getRequestMethod()
// 获取所有的请求头
Headers getRequestHeaders()
// 以输入流的方式获取请求内容
InputStream getRequestBody()
// 获取响应头的 Map, 要添加头, 获取到 headers 后调用 add(key, value) 方法添加
Headers getResponseHeaders()
// 发送响应头, 并指定 响应code 和 响应内容的长度
void sendResponseHeaders(int rCode, long responseLength)
// 获取响应内容的输出流, 响应内容写到该流
OutputStream getResponseBody()
// 关闭处理器, 同时将关闭请求和响应的输入输出流(如果还没关闭)
void close()
// 获取此请求对应的上下文对象
HttpContext getHttpContext()
// 获取收到请求的本地地址
InetSocketAddress getLocalAddress()