Cómo escribir un servidor http desde cero
1. Cree un servidor de socket TCP.
La razón por la que escribí el servidor de socket TCP en primer lugar es porque la comunicación HTTP se basa en sockets TCP. El trabajo a realizar es escuchar el puerto especificado (el puerto de servicio HTTP predeterminado es 80), recibir solicitudes de acceso y establecer conexiones, recibir datagramas enviados y proporcionar la función de responder a datagramas. Este paso puede ser simple o complejo, teniendo en cuenta la concurrencia, el equilibrio, las restricciones de conexión de puertos o no hacer nada en absoluto. De todos modos, necesitamos escuchar en un puerto.
2. Escriba un analizador para analizar las solicitudes HTTP.
Dado que es un servicio HTTP, el datagrama recibido anteriormente por el puerto de escucha es naturalmente una solicitud HTTP. La solicitud se divide en encabezado y cuerpo, incluidos varios parámetros como dirección de acceso, UA, cookies, etc., así como contenido como el formulario de envío. Para obtener un formato detallado, consulte la documentación del protocolo HTTP.
3. Implementar enrutamiento de URL.
Tras obtener la Solicitud, sabemos qué dirección visitó el usuario, y debemos señalar el contenido correspondiente. El trabajo de especificar el contenido en función de la dirección es el enrutamiento, proporcionando diferentes rutas de procesamiento para diferentes programas (funciones, scripts...).
4. Generar una respuesta.
La respuesta HTTP es en realidad muy similar a la solicitud, pero también distingue entre el encabezado y el cuerpo, y agrega algunas palabras clave más para indicar el tipo de contenido de la respuesta correspondiente en el estado actual. El cuerpo contiene la respuesta que necesita, que puede ser json, archivos estáticos u otras cosas. Puede obtener el contenido de la respuesta de la ruta y ajustarlo de acuerdo con los requisitos de la respuesta HTTP. Finalmente, será devuelto al usuario a través del servicio de socket anterior.
Básicamente, un servidor HTTP simple tiene un límite y se puede decir que no es complicado. Pero considerando varias funciones adicionales, como permisos, filtrado de IP, concurrencia/asíncrono, reenvío de solicitudes, websocket, https... en realidad es bastante problemático.