JDK6中httpserver创建http服务端实例

本文介绍 JDK6 中 HttpServer 的使用方法,包括创建 HttpServer 实例、定义 Handler 和 Filter 处理请求的过程,并通过一个具体示例展示了如何处理 HTTP GET 请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HttpServer是JDK6提供的一个轻量的http server,位于

  • com.sun.net.httpserver
  • com.sun.net.httpserver.spi

主要的接口或类如下

Class/interface What does it do?

HttpServerListens on a particular port number and address for incoming Http requests
HttpsServerSame as for HttpServer except for Https requests
HttpHandlerProgrammer implements this. Handler is called to handle each incoming Http request
HttpExchangeEncapsulates all of the information about a Http request and the corresponding response
HttpContextRepresents one Http application on a HttpServer instance. It is identified by the URI path to the application, and has a HttpHandler associated

更多的详情见这里。下面来见一个简单的例子

1、创建一个HttpServer实例

InetSocketAddress addr = new InetSocketAddress(8080);  
//创建一个httpserver实例,0表示开启服务  
HttpServer server = HttpServer.create(addr, 0);  
//HttpContext与servlet中的ServletContext类似  
//这里指定了ContextPath(/get/user),以及相应的Handler(Servlet)  
HttpContext context = server.createContext("/get/user", new ParameterHandler());  
//这里指定了Filter  
context.getFilters().add(new ParameterFilter());  
server.setExecutor(Executors.newCachedThreadPool());  
server.start();  

 这样就创建了一个端口8080的http server当前对其中注册的Handler和Filter接下来需要说明

 

2、这里的ParameterHandler需要实现HttpHandler用来处理请求。这里实现一个简单用例:打印headers和将请求中的参数作为string返回

public class ParameterHandler implements HttpHandler {  
  
    public void handle(HttpExchange exchange) throws IOException {  
  
        String requestMethod = exchange.getRequestMethod();  
        if (requestMethod.equalsIgnoreCase("GET")) {  
            Headers responseHeaders = exchange.getResponseHeaders();  
            responseHeaders.set("Content-Type", "text/plain");  
            exchange.sendResponseHeaders(200, 0);  
  
            OutputStream responseBody = exchange.getResponseBody();  
            Headers requestHeaders = exchange.getRequestHeaders();  
            Set<String> keySet = requestHeaders.keySet();  
            Iterator<String> iter = keySet.iterator();  
            //print headers info  
            responseBody.write("headers: \n".getBytes());  
            while (iter.hasNext()) {  
                String key = iter.next();  
                List<?> values = requestHeaders.get(key);  
                String s = key + " = " + values.toString() + "\n";  
                responseBody.write(s.getBytes());  
            }  
  
            //print parameters  
            responseBody.write("parameters: \n".getBytes());  
            @SuppressWarnings("unchecked")  
            Map<String, String> params = (Map<String, String>) exchange.getAttribute("parameters");  
            for (Map.Entry<String, String> entry : params.entrySet()) {  
                responseBody.write((entry.getKey() + " = " + entry.getValue() + "\n").getBytes());  
            }  
  
            responseBody.close();  
        }  
    }  
  
}  

3、在上面的ParameterHandler中我们用到了

exchange.getAttribute("parameters"); 

 但是parameters并没有处理,这就需要在Filter中来实现。也是在HttpContext 中加入的Filter,需要继承Filter。这和Servlet规范中很类似吧

public class ParameterFilter extends Filter {  
  
    @Override  
    public String description() {  
        return "description...";  
    }  
  
    @Override  
    public void doFilter(HttpExchange exchange, Chain chain) throws IOException {  
        URI uri = exchange.getRequestURI();  
        String rawQuery = uri.getRawQuery();  
        if (null != rawQuery) {  
            Map<String, String> map = new HashMap<String, String>();  
            String[] params = rawQuery.split("&");  
            for (String param : params) {  
                String[] paras = param.split("\\=");  
                map.put(paras[0], paras[1]);  
            }  
            exchange.setAttribute("parameters", map);  
        }  
        chain.doFilter(exchange);  
    }  
}  

 这里只是把请求(GET)中的参数做简单的处理并设置到HttpContext中。

 

4、到这一步这个例子也已差不多了,运行1中的代码即可在浏览器中访问,比如我们的访问及结果如下:

//RequestUrl  
http://localhost:8080/get/user?name=robin&gender=male 

headers:   
Host = [localhost:8080]  
Accept-charset = [GBK,utf-8;q=0.7,*;q=0.3]  
Accept-encoding = [gzip,deflate,sdch]  
Connection = [keep-alive]  
Accept-language = [zh-CN,zh;q=0.8]  
User-agent = [Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.96 Safari/537.4]  
Accept = [text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8]  
parameters:   
name = robin  
gender = male 

DONE!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值