龙空技术网

Java中的简单HTTP服务器

源码情报局 728

前言:

目前朋友们对“http服务器java”大致比较看重,朋友们都需要剖析一些“http服务器java”的相关内容。那么小编也在网络上网罗了一些关于“http服务器java””的相关内容,希望你们能喜欢,大家一起来了解一下吧!

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

标签: #http服务器java