2010-06-02 27 views
9

¿Cómo puedo detectar que el lado del cliente de una solicitud de servlet tomcat se ha desconectado? He leído que debo hacer una response.getOutputStream(). Print(), luego una response.getOutputStream(). Flush() y atrapo una IOException, pero ¿hay alguna manera de que pueda detectar esto sin escribir ningún dato?¿Detecta la desconexión del cliente en el servlet de tomcat?

EDITAR:

El servlet envía un flujo de datos que no termina necesariamente, pero no necesariamente todos los datos que fluyen a través de él (que es un flujo de eventos en tiempo real). Necesito detectar realmente cuando el cliente se desconecta porque tengo que hacer algunas tareas de limpieza en ese momento (recursos para lanzar, etc.). Si tengo HttpServletRequest disponible, ¿intentaré leer desde allí una IOException si el cliente se desconecta?

Respuesta

8

¿Hay alguna manera de detectar este sin escribir ningún dato?

No porque no hay una forma en TCP/IP para detectarlo sin escribir ningún dato.

No te preocupes. Simplemente complete las acciones de solicitud y escriba la respuesta. Si el cliente ha desaparecido, se producirá una IOException: restablecimiento de la conexión, que se lanzará al contenedor del servlet. Nada que tengas que hacer al respecto.

+2

* "No tienes que hacer nada al respecto" * - y no puedes hacer nada al respecto. –

+0

Edité la pregunta para aclarar. Me gustaría no tener que enviar datos espurios al cliente a menos que sea absolutamente necesario. – Seth

+0

No lo harás. Obtendrá una excepción en su lugar, y el contenedor se ocupará de ello. – EJP

5

Necesito detectar realmente cuando el cliente se desconecta porque tengo algo de limpieza que tengo que hacer en ese punto (recursos para liberar, etcétera).

Allí el bloque finally es para. Se ejecutará independientemente del resultado. P.ej.

OutputStream output = null; 
try { 
    output = response.getOutputStream(); 
    // ... 
    output.flush(); 
    // ... 
} finally { 
    // Do your cleanup here. 
} 

Si tengo el HttpServletRequest disponibles, se trata de leer desde que arrojan una IOException si el cliente se desconecta?

Depende de cómo está leyendo y cuánto del cuerpo de la solicitud ya está en la memoria del servidor. En el caso de solicitudes codificadas en forma normal, cada vez que llame al getParameter() de antemano, generalmente se analizará por completo y se almacenará en la memoria del servidor. Llamar al getInputStream() no será útil en absoluto. Mejor hacerlo en la respuesta en su lugar.

+0

El cuerpo de la solicitud no está en la memoria del servidor, hasta que lo lea (mediante el flujo de entrada de solicitud o llamando a getParameter() en caso de POST con application/x-www-form-urlencoded). El cuerpo de la solicitud puede ser de cualquier tamaño, el servidor no puede simplemente almacenarlo en la memoria caché. –

+0

@Peter: eliminé la ambigüedad. – BalusC

1

Ha intentado vaciar el búfer de la respuesta: response.flushBuffer(); Parece lanzar una excepción IOException cuando el cliente se desconectó.

+0

No se lanzará a menos que realmente tenga algo que enviar al cliente. –

Cuestiones relacionadas