Вы хотите внедрить HTTP-сервер , но не хотите рисковать написанием полноценного HTTP-сервера? Разработка HTTP-сервера с полной функциональностью не является тривиальной задачей. Но у Java есть решение этой проблемы. Java поддерживает встроенный HTTP-сервер. Просто написав 100 строк кода, мы можем разработать несколько приличный HTTP-сервер, который может обрабатывать запросы HTTP GET и POST. Мы также можем использовать его для обработки других HTTP-команд.
Класс HTTPServer
Java SDK предоставляет встроенный сервер под названием HttpServer
. Этот класс относится к com.sun.net
упаковке.
Мы можем создать экземпляр сервера следующим образом:
Джава
xxxxxxxxxx
1
HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 8001), 0);
Приведенная выше строка создает HTTPServer
экземпляр на локальном узле с номером порта 8001. Но есть еще один аргумент со значением 0. Это значение используется для обратной регистрации .
Вернуться Вход
Когда сервер принимает запрос клиента, этот запрос сначала будет поставлен в очередь операционной системой. Позже он будет передан на сервер для обработки запроса. Все эти одновременные запросы будут поставлены в очередь операционной системой. Однако операционная система решит, сколько из этих запросов может быть поставлено в очередь в любой данный момент времени. Это значение представляет обратную регистрацию. В нашем примере это значение равно 0, что означает, что мы не ставим в очередь никаких запросов.
Вам также может понравиться: Программирование моделей для серверов на Java .
Код сервера
Мы собираемся разработать следующий код HTTP-сервера:
Джава
xxxxxxxxxx
1
server.createContext("/test", new MyHttpHandler());
2
server.setExecutor(threadPoolExecutor);
3
server.start();
4
logger.info(" Server started on port 8001");
Мы создали контекст под названием test
. Это не что иное, как корень контекста приложения. Второй параметр — это экземпляр обработчика, который будет обрабатывать HTTP-запросы. Мы рассмотрим этот класс в ближайшее время.
Мы можем использовать исполнителя пула потоков вместе с этим экземпляром сервера. В нашем случае мы создали пул потоков с 10.
Джава
xxxxxxxxxx
1
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)Executors.newFixedThreadPool(10);
Далее запускаем сервер:
Джава
xxxxxxxxxx
1
server.start();
Всего от трех до четырех строк кода мы создали HTTP-сервер с корневым контекстом, который прослушивает порт!
Класс HTTPHandler
Это интерфейс с вызванным методом handle(..)
. Давайте посмотрим на нашу реализацию этого интерфейса.
Джава
1
private class MyHttpHandler implements HttpHandler {
2
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
Запрос GET обрабатывается handleGETRequest()
методом. Этот метод, в свою очередь, вызывает getRequestURI()
метод HttpExchange
класса для извлечения значения параметра запроса, содержащегося в URI . Это минимальный метод, который будет обрабатывать только один параметр, присутствующий в запросе. Тем не менее, это может быть изменено для удовлетворения различных требований.
Обработка ответа
Наконец, мы собираемся отправить наш ответ обратно клиенту. Это достигается handleResponse(..)
методом. В этом методе мы получаем выходной поток, вызывая getResponseBody()
метод HttpExchange
класса. Позже мы можем записать содержимое HTML в поток вывода.
Наиболее важным моментом является отправка response header
обратно клиенту. Если вы пропустите это, вы получите сообщение об ошибке ERR_EMPTY_RESPONSE
в браузере.
Если все идет хорошо, вы можете увидеть ответ в браузере для URL запроса:
http://localhost:8001/test?name=sam
,