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) {
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