028-86261949

当前位置:首页 > 学科资讯 > Java中的简单HTTP服务器

Java中的简单HTTP服务器

2020/03/12 17:21 分类: 学科资讯 浏览:6

您想要实现http服务器但是,您不想冒任何风险编写一个成熟的HTTP服务器吗?开发一个功能齐全的HTTP服务器并不是一项简单的任务。但是Java已经找到了解决这类问题的方法。Java支持内置的HTTP服务器.只需编写100行代码,我们就可以开发出一个相当不错的HTTP服务器,它可以处理HTTPGET和POST请求。我们还可以利用它来处理其他HTTP命令。

HTTPServer类

JavaSDK提供了一个内置的服务器,名为HttpServer。这类属于com.sun.net 包裹。

我们可以像这样实例化服务器:

HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 8001), 0);

上面的行创建一个HTTPServer 实例,其端口号为8001。但是,还有一个值为0的参数。此值用于背向测井.

背向测井

当服务器接受客户端请求时,此请求将首先由操作系统排队。稍后,它将被赋予服务器来处理请求。所有这些同时的请求都将由操作系统排队。但是,操作系统将决定这些请求中有多少可以在任何给定的时间点排队。此值表示回发日志记录。在我们的示例中,此值为0,这意味着我们不对任何请求进行排队。

服务器代码

我们将开发以下HTTP服务器代码:

server.createContext("/test", new  MyHttpHandler());
2
server.setExecutor(threadPoolExecutor);
3
server.start();
4
logger.info(" Server started on port 8001");

我们创建了一个名为test。这只不过是应用程序的上下文根。第二个参数是一个处理程序实例,它将处理HTTP请求。我们很快就会调查这门课。

我们可以使用线程池执行器,以及这个服务器实例。在我们的例子中,我们用10创建了一个线程池。

ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)Executors.newFixedThreadPool(10);

接下来,我们启动服务器:

 

server.start();

使用三到四行代码,我们创建了一个http服务器使用侦听端口的上下文根!

HTTPHandler类

这是一个接口,它有一个名为handle(..)。让我们看看这个接口的实现。

private class MyHttpHandler implements HttpHandler {    
2
  @Override    
3
  public void handle(HttpExchange httpExchange) throws IOException {
4
    String requestParamValue=null; 
5
    if("GET".equals(httpExchange.getRequestMethod())) { 
6
       requestParamValue = handleGetRequest(httpExchange);
7
     }else if("POST".equals(httpExchange)) { 
8
       requestParamValue = handlePostRequest(httpExchange);        
9
      }  
10
11
    handleResponse(httpExchange,requestParamValue); 
12
  }
13
14
   private String handleGetRequest(HttpExchange httpExchange) {
15
            return httpExchange.
16
                    getRequestURI()
17
                    .toString()
18
                    .split("\\?")[1]
19
                    .split("=")[1];
20
   }
21
22
   private void handleResponse(HttpExchange httpExchange, String requestParamValue)  throws  IOException {
23
            OutputStream outputStream = httpExchange.getResponseBody();
24
            StringBuilder htmlBuilder = new StringBuilder();
25
            
26
            htmlBuilder.append("<html>").
27
                    append("<body>").
28
                    append("<h1>").
29
                    append("Hello ")
30
                    .append(requestParamValue)
31
                    .append("</h1>")
32
                    .append("</body>")
33
                    .append("</html>");
34
35
            // encode HTML content 
36
            String htmlResponse = StringEscapeUtils.escapeHtml4(htmlBuilder.toString());
37
     
38
            // this line is a must
39
            httpExchange.sendResponseHeaders(200, htmlResponse.length());
40
41
            outputStream.write(htmlResponse.getBytes());
42
            outputStream.flush();
43
            outputStream.close();
44
        }
45
}

这是处理请求并将响应发送回客户端的代码。请求和响应由HttpExchange 班级。

处理GET请求

获取请求由handleGETRequest()方法。此方法依次调用getRequestURI() 方法HttpExchange 类中包含的请求参数值。乌里。这是一个最小的方法,只处理请求中的一个参数。然而,这可以修改以满足不同的要求。

手柄响应

最后,我们将把我们的响应发送回客户端。这是通过handleResponse(..)方法。在此方法中,通过调用getResponseBody()方法HttpExchange 班级。稍后,我们可以将HTML内容写入输出流。

最重要的一点是发送response header 回到客户那里。如果您错过了它,您将得到一个名为ERR_EMPTY_RESPONSE在浏览器里。

#标签:Java,HTTP服务器