Java中的简单HTTP服务器


Java中的简单HTTP服务器


您想要实现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在浏览器里。


分享到:


相關文章: