您想要实现http服务器但是,您不想冒任何风险编写一个成熟的HTTP服务器吗?开发一个功能齐全的HTTP服务器并不是一项简单的任务。但是Java已经找到了解决这类问题的方法。Java支持内置的HTTP服务器.只需编写100行代码,我们就可以开发出一个相当不错的HTTP服务器,它可以处理HTTPGET和POST请求。我们还可以利用它来处理其他HTTP命令。
HTTPServer类
JavaSDK提供了一个内置的服务器,名为HttpServer。这类属于com.sun.net 包裹。
我们可以像这样实例化服务器:
<code>HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 8001), 0);/<code>
上面的行创建一个HTTPServer 实例,其端口号为8001。但是,还有一个值为0的参数。此值用于背向测井.
背向测井
当服务器接受客户端请求时,此请求将首先由操作系统排队。稍后,它将被赋予服务器来处理请求。所有这些同时的请求都将由操作系统排队。但是,操作系统将决定这些请求中有多少可以在任何给定的时间点排队。此值表示回发日志记录。在我们的示例中,此值为0,这意味着我们不对任何请求进行排队。
服务器代码
我们将开发以下HTTP服务器代码:
<code>server.createContext("/test", new MyHttpHandler());/<code>
2
<code>server.setExecutor(threadPoolExecutor);/<code>
3
<code>server.start();/<code>
4
<code>logger.info(" Server started on port 8001");/<code>
我们创建了一个名为test。这只不过是应用程序的上下文根。第二个参数是一个处理程序实例,它将处理HTTP请求。我们很快就会调查这门课。
我们可以使用线程池执行器,以及这个服务器实例。在我们的例子中,我们用10创建了一个线程池。
<code>ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)Executors.newFixedThreadPool(10);/<code>
接下来,我们启动服务器:
<code>server.start();/<code>
使用三到四行代码,我们创建了一个http服务器使用侦听端口的上下文根!
HTTPHandler类
这是一个接口,它有一个名为handle(..)。让我们看看这个接口的实现。
<code>private class MyHttpHandler implements HttpHandler { /<code>
2
<code> @Override /<code>
3
<code> public void handle(HttpExchange httpExchange) throws IOException {/<code>
4
<code> String requestParamValue=null; /<code>
5
<code> if("GET".equals(httpExchange.getRequestMethod())) { /<code>
6
<code> requestParamValue = handleGetRequest(httpExchange);/<code>
7
<code> }else if("POST".equals(httpExchange)) { /<code>
8
<code> requestParamValue = handlePostRequest(httpExchange); /<code>
9
<code> } /<code>
10
11
<code> handleResponse(httpExchange,requestParamValue); /<code>
12
<code> }/<code>
13
14
<code> private String handleGetRequest(HttpExchange httpExchange) {/<code>
15
<code> return httpExchange./<code>
16
<code> getRequestURI()/<code>
17
<code> .toString()/<code>
18
<code> .split("\\\\?")[1]/<code>
19
<code> .split("=")[1];/<code>
20
<code> }/<code>
21
22
<code> private void handleResponse(HttpExchange httpExchange, String requestParamValue) throws IOException {/<code>
23
<code> OutputStream outputStream = httpExchange.getResponseBody();/<code>
24
<code> StringBuilder htmlBuilder = new StringBuilder();/<code>
25
<code> /<code>
26
<code> htmlBuilder.append("")./<code>
27
<code> append("")./<code>
28
<code> append("").
/<code>
29
<code> append("Hello ")/<code>
30
<code> .append(requestParamValue)/<code>
31
<code> .append("")/<code>
32
<code> .append("")/<code>
33
<code> .append("");/<code>
34
35
<code> // encode HTML content /<code>
36
<code> String htmlResponse = StringEscapeUtils.escapeHtml4(htmlBuilder.toString());/<code>
37
<code> /<code>
38
<code> // this line is a must/<code>
39
<code> httpExchange.sendResponseHeaders(200, htmlResponse.length());/<code>
40
41
<code> outputStream.write(htmlResponse.getBytes());/<code>
42
<code> outputStream.flush();/<code>
43
<code> outputStream.close();/<code>
44
<code> }/<code>
45
<code>}/<code>
这是处理请求并将响应发送回客户端的代码。请求和响应由HttpExchange 班级。
处理GET请求
获取请求由handleGETRequest()方法。此方法依次调用getRequestURI() 方法HttpExchange 类中包含的请求参数值。乌里。这是一个最小的方法,只处理请求中的一个参数。然而,这可以修改以满足不同的要求。
手柄响应
最后,我们将把我们的响应发送回客户端。这是通过handleResponse(..)方法。在此方法中,通过调用getResponseBody()方法HttpExchange 班级。稍后,我们可以将HTML内容写入输出流。
最重要的一点是发送response header 回到客户那里。如果您错过了它,您将得到一个名为ERR_EMPTY_RESPONSE在浏览器里。
閱讀更多 源碼時代 的文章