¿Cómo sé cuándo cerrar una conexión HTTP 1.1 Keep-Alive?
-
02-07-2019 - |
Pregunta
Estoy escribiendo un servidor web en Java y quiero que admita conexiones HTTP 1.1 Keep-Alive. Pero, ¿cómo puedo saber cuándo el cliente ha terminado de enviar solicitudes para una conexión determinada? (como un doble final de línea o algo así).
Veamos cómo stackoverflow maneja esta pregunta muy oscura: respuestas para las cuales, en Google, están empantanadas en especificaciones técnicas y lenguaje oscuro. Quiero una respuesta en inglés para un programador que no sea C :)
Ya veo. eso confirma mi sospecha de tener que confiar en la SocketTimeoutException. Pero no estaba seguro de si había algo en lo que pudiera confiar del cliente que indicara que se hizo con la conexión, lo que me permitiría cerrar las conexiones antes en la mayoría de los casos, en lugar de esperar el tiempo de espera. Gracias
Solución
Si está creando su servidor para cumplir con el estándar, entonces ya tiene mucha información para guiarlo aquí.
Habla simple, debe basarse en un tiempo desde que se usó una conexión, y no tanto en el nivel de los datos de solicitud.
De manera más larga, la sección de consideraciones prácticas del documento HTTP / 1.1 tiene alguna guía para usted:
" Los servidores generalmente tendrán algunos valor de tiempo de espera más allá del cual lo harán ya no mantener un inactivo conexión. Los servidores proxy pueden hacer este es un valor más alto ya que es probable que el cliente hará más conexiones a través del mismo servidor. El uso de conexiones persistentes. no establece requisitos en la longitud (o existencia) de este tiempo de espera para ya sea el cliente o el servidor. "
o
" Cuando un cliente o servidor desea tiempo de espera DEBE emitir un agraciado cerrar en la conexión de transporte. Los clientes y servidores DEBEN ambos constantemente vigilando el otro lado de el transporte se cierra y responde según sea apropiado. Si un cliente o servidor no detecta el cierre del otro lado rápidamente podría causar innecesaria drenaje de recursos en la red. "
Otros consejos
Veamos cómo stackoverflow maneja esta pregunta muy oscura: respuestas para las cuales, en Google, están empantanadas en especificaciones técnicas y lenguaje oscuro.
Acabo de poner ¿Cuándo debería cerrar una conexión HTTP 1.1? en Google, y el tercer éxito fue HTTP Made Really Easy. En la tabla de contenido, hay un enlace a una sección titulada Conexiones persistentes y el " ; Conexión: cerrar " Encabezado . Esta sección tiene tres párrafos, usa un lenguaje muy simple y te dice exactamente lo que quieres saber.
Quiero una respuesta en inglés sencillo para un programador que no sea C :)
Con el debido respeto, la programación es un esfuerzo técnico donde los detalles son muy importantes. Leer la documentación técnica es una habilidad absolutamente esencial. Confiando en `` Inglés simple '' Las interpretaciones de terceros de las especificaciones solo darán lugar a un mal trabajo.
Ciérralo cuando quieras. El encabezado indica que el cliente preferiría que dejara la conexión abierta, pero eso no requiere que el servidor cumpla. La mayoría de los servidores lo dejan abierto durante unos 5-10 segundos, algunos no le prestan atención en absoluto.
Debería leer los RFC relacionados con la función Keep-Alive. De lo contrario, podría terminar con un servidor que no funciona como se esperaba.
Como @ [Stephen] ya ha señalado, el servidor es libre de cerrar la conexión en cualquier momento que lo desee (ok, no en el medio de un par de solicitud / respuesta). Lo mismo para el cliente. Cualquier otra solución permitiría al servidor o al cliente realizar un DoS en la otra parte.
EDITAR: Eche un vistazo al encabezado de conexión. El cliente (y el servidor) pueden solicitar un cierre de conexión elegante utilizando el encabezado. Por ejemplo, Connection: close
dentro de la solicitud es una solicitud al servidor para cerrar la conexión después de que envíe la respuesta.