2011-10-31 24 views
10

Tengo una aplicación cliente de servidor simple. Todo funciona, pero en algún momento lleva más de 5 minutos obtener la respuesta del servidor (lo cual es normal y debe ser así). El problema es que si lleva más de 5 minutos sigo recibiendo esta excepción: java.net.SocketTimeoutException: Read timed out.Java, aumente el tiempo de espera del socket

Entonces, me preguntaba si hay algún tiempo de espera del socket predeterminado en Windows o en la máquina virtual Java que podría establecer? No puedo cambiar el código del cliente así que setSoTimeout() no es una opción para mí.

Uso de Windows XP ..

EDIT: Como lo entiendo ahora es que la conexión de socket no se abre en el lado del cliente. Fue transmitido desde el servidor. Así que decompilé también el archivo jar del servidor. Pero todavía no puedo encontrar nada sobre el tiempo de espera.

+0

Compruebe si el tiempo de espera se configura con las propiedades del sistema. – JimmyB

+0

@HannoBinder, ¿puede explicar qué quiere decir con las propiedades del sistema? – hs2d

+0

Me refiero a algo así como [sun.net.client.defaultReadTimeout] (http://download.oracle.com/javase/1.4.2/docs/guide/net/properties.html), o lo que sea que se aplique a la manera de su cliente de conectar. – JimmyB

Respuesta

10

El tiempo de espera predeterminado del socket es 0, lo que significa que nunca se agota el tiempo de espera. Si transcurre el tiempo de espera después de 5 minutos, significa que se ha establecido dentro del código. Si la fuente no está disponible, y no hay una configuración, puede intentar descompilar la clase y buscar las llamadas setSoTimeout.

Como los comentarios y el hecho de que las búsquedas no encontraron ninguna llamada a setSoTimeout(), puede tomar un enfoque diferente. Simplemente déjelo salir y escriba un pequeño script que reintentará la llamada en caso de que lo haga. Si puede llamar a su cliente desde la línea de comando, puede analizar el resultado, si continúa en stderr.

+0

Descompilé y busqué las llamadas 'setSoTimeout' pero no encontré nada. Debe estar establecido en otro lugar entonces? – hs2d

8

Mantener conexión TCP no utilizado abierta por mucho tiempo sin tráfico no es tan trivial. Muchos firewalls/enrutadores cierran los puertos no utilizados después de un tiempo de espera excedido.

Una opción podría ser implementar un protocolo keepalive simple para enviar paquetes ficticios de vez en cuando, pero si no puede tocar el código del cliente esto probablemente no sea una opción.

Editar: No tengo conocimiento de ninguna forma de anular setSoTimeout() establecido en el código del cliente.

+0

muy buena idea con el paquete Keep alive! – benez

+0

@benez No estoy de acuerdo. Si el enrutador considera que la conexión es un recurso tan valioso que lo interrumpe, no hay ningún negocio que lo engañe para mantenerlo abierto. En cualquier caso, de todos modos, aún tiene que ocuparse de las pérdidas de conexión. Agregar pings de keepalive es realmente un dolor inútil en el cuello realmente. – EJP

+0

@EJP aún no he visto una implementación adecuada para manejar las pérdidas de conexión. hay casos en los que está esperando actualizaciones en tiempo real y necesita dos partes conectadas constantemente para mantener sus datos sincronizados. las pérdidas de conexión no se manejan simplemente con una simple reconexión. perderá un mensaje importante o lo recibirá tarde. p.ej. los mercados bursátiles siempre envían latidos y el protocolo irc requiere que responda a un ping con pong. y sí, tiene que lidiar con pérdidas de conexión, pero es posible que desee evitarlas en algunos programas. – benez

0

respuesta que 0 es el tiempo de espera por defecto no es del todo cierto. Como, por ejemplo, el cliente Axis2 tiene un tiempo de espera predeterminado de 60 segundos, por lo que dependerá del tipo de implementación que esté utilizando para realizar la llamada.

¿Puede proporcionar más detalles? Lo siento por escrito en la sección de respuestas, pero no tengo la reputación suficiente para hacer comentarios :)

+0

Mirando el código aquí, solo puedo ver 'java.io.InputStream'. Entonces, ¿la conexión debe hacerse desde el servidor al cliente? – hs2d

+0

bueno, sí, para Java el valor predeterminado es infinito, pero una biblioteca puede cambiar eso. Tal vez es una pista, hs2d, ¿tiene algún frasco incluido? O tal vez, puede adoptar un enfoque diferente, simplemente deje que transcurra el tiempo de espera y vuelva a intentarlo si falla. – stivlo

0

Y Qué se necesita para mantener la conexión viva? ¿Por qué no lo reconsideras para que sea más asincrónico? Ese esquema no está escalando en absoluto. En un punto, todos sus hilos disponibles podrían estar esperando una respuesta de mucho tiempo del servidor.

+0

Necesita mantener viva la conexión si quiere leer de ella. No puedo hacer cabeza o cola de todo esto. – EJP

Cuestiones relacionadas