2008-09-26 12 views
7

Estoy escribiendo un servidor web en Java y quiero que sea compatible con las 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í).¿Cómo sé cuándo DEBE cerrar una conexión HTTP 1.1 Keep-Alive?

Veamos cómo stackoverflow maneja esta pregunta muy oscura: respuestas que, en Google, están empantanadas en especificaciones técnicas y lenguaje oscuro. Quiero una respuesta en inglés simple para un programador que no sea C :)


I see. eso confirma mi sospecha de tener que confiar en 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

Respuesta

8

Si está construyendo su servidor para cumplir con el estándar, entonces ya tiene mucha información para guiarlo aquí.

Simple spoken, debe basarse en un tiempo desde que se usó una conexión, y no tanto en el nivel de datos de solicitud.

En un camino más largo aliento, la practical considerations section del HTTP/1.1 documento tiene alguna orientación para usted:

"Servidores normalmente tendrá algún valor de tiempo de espera más allá del cual se ya no mantener una conexión inactiva . los servidores proxy podrían hacer que este un valor más alto, ya que es probable que el cliente va a hacer más conexiones a través del mismo servidor. el uso de conexiones persistentes lugares sin 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 deseos para tiempo de espera que debe emitir una grácil cerca de la conexión de transporte. Los clientes y servidores DEBERÍAN ambos mirar constantemente para el otro lado de el transporte cerrar, y responder a él según corresponda. Si un cliente o servidor no detecta cerca del otro lado rápidamente que podría causar la fuga innecesaria recurso en la red "

+0

Gracias. También lo leí ... Los comentarios aquí confirman mis sospechas y ahora sé que no voy a ir a un callejón sin salida. Guau. ¡Stackoverflow funciona! Gracias – Bret

1

Lo cierras cuando lo deseas. El encabezado indica que el cliente prefiere que deje la conexión abierta, pero eso no requiere que el servidor cumpla. La mayoría de los servidores lo dejan abierto durante aproximadamente 5-10 segundos, algunos no le prestan atención en absoluto.

1

Debe leer los RFC que tratan 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 puede cerrar la conexión en cualquier momento que lo desee (vale, 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 usando 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.

+0

La razón por la que pregunto es que la mayoría de los navegadores web (específicamente todos los que he probado) continúan enviando el encabezado "Conexión: mantener vivo" incluso después de que todos los archivos .css/.js/etc hayan sido solicitado y recibido. Pensé que tal vez eran más inteligentes que eso y me faltaba algo. – Bret

+0

Los navegadores prefieren mantener su conexión abierta porque esto aumenta el tiempo de respuesta si necesitan enviar más solicitudes a los mismos servidores. No hay nada que impida que su servidor ignore la función Keep-Alive y cierre la conexión después de cada solicitud. – Alexander

3

Veamos como stackoverflow maneja esta muy oscuro pregunta -. Respuestas para las que, en Google, están sumidos en las especificaciones técnicas y el lenguaje oscuro.

acabo de poner When should I close an HTTP 1.1 connection? en Google, y el tercer golpe fue HTTP hace muy fácil. en la tabla de contenido, hay un enlace a una sección titulada Persistent Connections and the "Connection: close" Header . Esta la sección tiene tres párrafos, usa un lenguaje muy simple y te dice exactamente lo que quieres saber.

Quiero una respuesta clara-Inglés para un programador no C :)

Con el debido respeto, la programación es una tarea técnica, donde los detalles cuentan mucho. Leer documentación técnica es una habilidad absolutamente esencial. Confiar en interpretaciones de terceros "sencillas en inglés" de las especificaciones solo dará como resultado que usted haga un mal trabajo.

Cuestiones relacionadas