Primera introducción al protocolo HTTP escribiendo el servidor web Java más simple

Creo que no ser√≠a una exageraci√≥n decir que el conocimiento y la comprensi√≥n de la esencia del protocolo HTTP es necesario para cualquiera que haya decidido involucrarse seriamente en cualquiera de las √°reas del desarrollo web moderno. Mi experiencia personal sugiere que la comprensi√≥n no llega de inmediato. Me da verg√ľenza decir que hubo momentos en que las palabras GET y POST fueron similares a hechizos m√°gicos para m√≠, y ni siquiera sospech√© la existencia de PUT, PATCH y DELETE.

Hace unos meses, adem√°s del desarrollo en s√≠, tambi√©n comenc√© a ense√Īar, y surgi√≥ la pregunta sobre c√≥mo es m√°s f√°cil y m√°s claro decirles a los futuros desarrolladores de Java sobre la esencia del protocolo HTTP. Despu√©s de varios d√≠as de alboroto y una serie de intentos fallidos de hacer una presentaci√≥n, surgi√≥ la idea, por qu√© no escribir el servidor HTTP m√°s simple en Java, porque no explica la esencia del protocolo, as√≠ como su implementaci√≥n m√°s simple pero funcional.

Al final resultó que, esto no es en absoluto difícil. ¡A continuación se muestra el código que será suficiente para la interacción correcta con cualquier navegador! Todo lo que necesitamos es un ServerSocket y algunas E / S estándar.

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; public class HttpServer { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(8080)) { System.out.println("Server started!"); while (true) { //   Socket socket = serverSocket.accept(); System.out.println("Client connected!"); //      //    try (BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)); PrintWriter output = new PrintWriter(socket.getOutputStream())) { //     while (!input.ready()) ; //         System.out.println(); while (input.ready()) { System.out.println(input.readLine()); } //   output.println("HTTP/1.1 200 OK"); output.println("Content-Type: text/html; charset=utf-8"); output.println(); output.println("<p> !</p>"); output.flush(); //     try-with-resources , //         System.out.println("Client disconnected!"); } } } catch (IOException ex) { ex.printStackTrace(); } } } 

Intenta ejecutar este c√≥digo. Cabe se√Īalar que el puerto para el que se crea ServerSocket debe estar libre. Si el puerto especificado est√° ocupado, debe liberarlo o utilizar otro puerto libre.

Después de ejecutar este código, vaya a la ventana del navegador y escriba la barra de direcciones http://localhost:8080/ . Si todo salió bien, en la ventana del navegador veremos el texto "Hola a todos", y en el texto de registro del servidor similar al siguiente:

 Server started! Client connected! GET / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,he;q=0.6,de;q=0.5,cs;q=0.4 Cookie: _ga=GA1.1.1849608036.1549463927; portainer.pagination_containers=100; _gid=GA1.1.80775985.1550669456; If-Modified-Since: Sat, 05 Jan 2019 12:10:16 GMT Client disconnected! 

Cada vez que ingresamos algo en la barra de direcciones del navegador y presionamos Enter, no sucede nada más que enviar un texto que comienza con la palabra GET y termina con un avance de línea. Después de la palabra GET, un espacio sigue la ruta al documento solicitado en el servidor. Intente ingresar http://localhost:8080/something en el navegador y vea cómo cambia el texto de solicitud en el registro.

En las líneas de consulta, a partir de la segunda están los llamados encabezados mediante los cuales se transmite información sobre la configuración del cliente al servidor. Cada línea de encabezado tiene el formato [ ] : []; []; ... [] [ ] : []; []; ... [] [ ] : []; []; ... [] .

Despu√©s de que el servidor haya le√≠do completamente el texto de la solicitud, le enviamos la respuesta m√°s simple, cuya estructura es bastante simple y similar a la estructura de la solicitud. La primera l√≠nea contiene la versi√≥n del protocolo HTTP y el c√≥digo 200 OK , que le indicar√° al navegador que la solicitud se proces√≥ con √©xito (todos conocen mejor el c√≥digo 404, ¬Ņno es as√≠?)). Esto es seguido por un solo encabezado de tipo de contenido en el que se transmite informaci√≥n sobre el formato del documento transmitido (texto / html) y su codificaci√≥n (charset = utf-8). Despu√©s del encabezado hay un avance de l√≠nea (un requisito obligatorio del protocolo HTTP) y el texto real que se mostrar√° en el navegador.

Eso es todo! Por supuesto, esto está lejos de ser todo lo que necesita saber sobre el protocolo HTTP y los principios del desarrollo de servidores web, pero no quisiera complicar este ejemplo, porque Su tarea principal es demostrar la comunicación más simple a través del protocolo HTTP. En uno de mis próximos artículos, trataré de desarrollar el tema del estudio del protocolo HTTP a través de su implementación.

UPD Un ejemplo mucho más avanzado de dicho servidor se puede encontrar en Cómo funciona Tomcat: Una guía para desarrollar su propio contenedor de servlet Java de Paul Deck, Budi Kurniawan , Capítulo 1 - Servidor web simple .

UPD1. Seminario web basado en este artículo www.youtube.com/watch?v=RBUFdFKg_rI

Source: https://habr.com/ru/post/441150/


All Articles