feed twitter facebook LinkedIn facebook

Java » Evitar que un programa Java se cargue dos veces

febrero 22, 2012 por Víctor Cuervo 13 Comentarios Imprimir Imprimir

Algunos de vosotros nos habéis preguntado sobre cómo controlar que un programa Java se cargue dos veces. Es decir, que si ya lo hemos lanzado, evitemos que se vuelva a lanzar.

Existen formas desde Java Web Start y el modo SingleInstanceService para evitar que un programa se cargue dos veces. Pero en nuestro caso vamos a realizarlo de una forma "más manual" en Java, pero muy efectiva.

El truco es que el programa Java cree un objeto que esté escuchando a un puerto específico del ordenador. Para ello utilizamos un ServerSocket, objeto que nos permite crear un objeto escuchando a un determinado puerto.

  1. private static ServerSocket SERVER_SOCKET;
  2. SERVER_SOCKET = new ServerSocket(1334);

Escoge un puerto que no sea el estándar de los protocolos: 80 para el http, 21 para el ftp,... Vamos elige un número de puerto "raro".

Además vemos que el objeto ServerSocket que hemos instanciado es un objeto estático dentro de nuestro programa. Así, nuestro programa tendrá un listener sobre un puerto, al que nadie dirá nada, pero que lo dejará como reservado.

Lo que sucede es que si intentamos volver a crear un escuchador sobre ese puerto, saldrá una excepción indicando que el puerto ya está en uso. Esto nos permite controlar que ya hay una instancia de nuestro programa ejecutándose.

  1. try {
  2. SERVER_SOCKET = new ServerSocket(1334);
  3. System.out.println("Es la primera instancia de la aplicación...");
  4. System.out.println("Pulsa OK para terminar");
  5. System.in.read();
  6. } catch (IOException x) {
  7. System.out.println("Otra instancia de la aplicación se está ejecutando...");
  8. }

Con este simple código podemos evitar que un programa Java se ejecute dos veces.

Descargar el Codigo
Descargar el código
Error en el Codigo
Error en el código
Foro sobre Java
Foro sobre Java
tags: , , , ,

Artículos relacionados:

13 comentarios »

RSS feed para los comentarios de esta entrada. TrackBack URI

1 2
  1. Bitacoras.com
    febrero 22, 2012 #

    Información Bitacoras.com…

    Valora en Bitacoras.com: Algunos de vosotros nos habéis preguntado sobre cómo controlar que un programa Java se cargue dos veces. Es decir, que si ya lo hemos lanzado, evitemos que se vuelva a lanzar. Existen formas desde Java Web Start y el modo S……

  2. Héctor
    febrero 23, 2012 #

    Mil gracias amigo !!!!!!!!!!!!

    Me sirvió perfectamente, te lo agradezco.

  3. Víctor Cuervo
    febrero 23, 2012 #

    @Héctor,
    Me alegro enormemente que te haya servido. :-D

  4. Semana 27.febrero.2012 | aulambra.com
    marzo 5, 2012 #

    [...] los artículos tenemos una mezcla de peticiones de usuarios, como Evitar que un programa Java se cargue dos veces o artículos con novedades como Crear contenido editable en HTML5. Espero que sean de vuestro [...]

  5. Jhonatan
    marzo 9, 2012 #

    Hola Víctor, excelente tutorial, funciona de maravilla, los java consumen muchos recursos y nos ralentizan la web, de esta forma evitamos que se cargue el java varia veces, y el usuario tendrá una navegación más placentera. Saludos

  6. Víctor Cuervo
    marzo 9, 2012 #

    @Jhonatan, muchas gracias por el comentario. :-D

  7. Héctor
    marzo 13, 2012 #

    Hola Víctor, otra ves aquí molestando, una ves que implemente el código me funciono de maravilla pero con las modificaciones que me piden(que nunca van a terminar)implemente un reloj en tiempo real en donde hago uso de un Thread, el problema es de cuando ejecuto la aplicación me vota la excepción de que mi aplicación ya esta en proceso, creo que es a consecuencia del uso del Thread hay otra forma de poder validar si el programa se carga otra ves?. ya intente cambiando de puerto y nombre al socket pero no funciona alguna idea que me puedas dar para solucionar esto, de antemano muchas gracias.

  8. Juan
    marzo 28, 2012 #

    Hola, muy buen aporte, pero quisiera saber si me pudieras decir como hacer que cuando se ejecute por segunda vez te muestre el que ya esta abierto? de antemano muchas gracias por tu ayuda!

  9. Héctor
    marzo 28, 2012 #

    Que tal Juan, lo que puedes hacer es poner un JOptionPane informando al usuario de que ya esta abierto, yo lo tengo así:
    private void validaapertura(){

    try {
    SERVER_SOCKETE = new ServerSocket(1779);
    System.out.println(“Es la primera instancia de la aplicación…”);

    } catch (IOException x) {

    System.out.println(“Otra instancia de la aplicación se está ejecutando…”);

    //Informo al usuario
    JOptionPane.showMessageDialog(null, “EL SISTEMA YA SE ENCUENTRA EN EJECUCIÓN !!!”,”PRECAUCIÓN”,JOptionPane.WARNING_MESSAGE);

    //En esta parte cierro la segunda instancia de la aplicación que se intenta abrir
    System.exit(0);

    }

    }//fin de mi método valida apertura

    Espero y te sirva este ejemplo…
    Saludos

  10. Juan
    marzo 28, 2012 #

    Muchas gracias por tu pronta respuesta :)

    Me diste una gran idea, Gracias y Saludos!!!

1 2

Deja un comentario

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*