COMO DETECTAR EN MI CLIENTE SI MI LISTENER SE CAE

tengo un programa que hace uso de un listener hecj en java, el cual cuando el listener esta apagado e intento correr mi cliente lanza un mensaje diciendo que no es posible por que el server esta fuera de operacion por ese lado no hay problema.

en el caso que entre a mi programa cliente y este en operacion normal y si mi server se cae, mi cliente no detecta eso :( seria genial que si mandan peticones y mi server esta caido el mande un mensaje reportando que el server esta caido y que mi cliente intente reconectarse a otro server donde esta el programa servidor.

algunos consejos de como realizar dicha tarea???

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

ping

Pues una opción simple es implementar un ping. Simplemente un mensaje muy simple, por ejemplo el cliente manda "MARCO" al servidor y espera que de inmediato le conteste "POLO"; si no recibe respuesta lo considera fuera de línea. Y el cliente hace eso cada 30 segundos o cada minuto por ejemplo. Eso es útil sobre todo si la comunicación es sobre una sola conexión usando un protocolo asíncrono, pero también sirve si son peticiones por http o algún otro protocolo síncrono con esquema de una conexión por petición.

Imagen de beto.bateria

Para saber como controlar

Para saber como controlar errores ¿Que tipo de cliente es?, ¿es un cliente web?, ¿un programa desktop o un movil?.

si es web lo podrias hacer con ajax:
http://es.wikipedia.org/wiki/XMLHttpRequest

Si es movil o desktop, por ejemplo Android/j2me/Blackberry/swing o algo similar, se puede resolver con algunas algunas adaptaciones al codigo:
http://developer.android.com/reference/java/net/HttpURLConnection.html

ezamudio

ezamudio me gustaria hacer lo siguiente, al hacer ping y no encontrar mi server activo, me gustaria que automaticamente se redirecciora y buscara en otro server , por ejemplo en mi red local tengo el pc1server
192.168.18.5

pc2server 192.168.18.6
pc3server 192.168.18.7

por defecto todas la peticiones se van por el 18.5 pero si el server se cae por cualquier razon no se un ataque de al qaeda y mi cliente al dectar que no recibe peticiones por el 18.5 las redireccione automaticamente al 18.6

Esa es una buena idea, pero

Esa es una buena idea, pero no lo hagas en el cliente, hazla en el server. Le envias a la IP 18.5 y este lo redirecciona al que tenga menos trabajo y/o este arriba pregunandole al 18.6, 18.7 etc. si estan vivos. Oculta estos detalles al cliente.

Porque estas queriendo hacer un balanceador de cargas tu mismo. Hay mucho software para eso.

que software me recomienda..

que software me recomienda para no hacer eso a mano??? y haga uso de de mi server hecho en java

Mas fierritos

Lo malo es que en este caso necesita un balanceador y de ahi direccionar el tráfico segun carga de procesamiento (para monitorear eso, en una chamba usaban JRobin). Eso quiere decir que debe de tener un equipo exclusivamente para recibir peticiones. Mmmmm, no suena mal, de hecho es buena escusa para no exponer directamente los servidores y de paso protegerlos con un firewall que permita comunicaciones entrantes solo del balanceador...

                         firewall
                            |
cliente---> balanceador---> | ---> Servers[1,2,3 ... n]
                            |

Mmmmm suena mejor. El único problema es que requieres de mas infraestructura para esta topologia. Quizas una compu más sea suficiente.

Alguna ocación cuando quise hacer algo similar me vino a la mente la tabla DNS en la que se definen servidores opcionales en caso de que el primero no se encuentre, en caso de que el segundo no se encuentre, el tercero, el cuarto, etc (ya tu sabras cuantos). No necesité mas que un properties similar a:

 server.1=110.120.130.140
 server.2=110.120.130.141
 server.3=110.120.130.142

De esa forma podia poner en un bucle el intento de conexión

Conexion conexion;
 
for(int indiceServidor= 1 ... ) {
    DatosDeConexion datos = algo.getDatosDeConexion(indiceServidor)
    try {
        conexion = clase.conectate();
    } catch (ConexionException e) {
        continue;
    }

    break;
}

if(conexion == null || ! conexion.isConnected) {
    // Aqui decides que hacer si de plano no se pudo con ninguno
}

Lo malo es distribuir las IP (si llegan a cambiar), bueno, eso si tienes muchos clientes

Busca load balancing. Pero tu

Busca load balancing. Pero tu solucion debe de user webservers en vez de un server hecho en casa con un protocolo inventado. Si estas en posibilidad puedes usar un servicio en la nube para que no te preocupes por el balenceo.