Este es un breve ejemplo sobre como crear un socket para controlar que corra una única instancia de tu app y que se quede escuchando hasta recibir un stop / shutdown para cerrar la aplicación.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Inet4Address;
import java.net.ServerSocket;
import java.net.Socket;
import javax.net.ServerSocketFactory;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
/**
* Socket stop example
* @author peiretti
*
*/
public class SocketStop {
static Logger logger = Logger.getLogger(SocketStop. class );
private static int port = 9898;
public static void main(String[] args) {
// Log4J
BasicConfigurator.configure();
logger .setLevel(Level. DEBUG );
// Check arguments
for (String string : args) {
if ( "stop" .equals(string.toLowerCase()) || "shutdown" .equals(string.toLowerCase()));
try {
stop();
return ;
} catch (Throwable e) {
return ;
}
}
// --
// -- inicializo otros servicios (ej. spring) y la applicacion ...
// ......................... init app swing ...
// ---
// -- inicializo el Socket y lo dejo escuchando...
ServerSocket serverSocket;
try {
serverSocket = ServerSocketFactory.getDefault().createServerSocket( port , 2, Inet4Address.getLocalHost());
} catch (Exception e) {
logger .error( "Ya hay otra instacia de la aplicacion en ejecucion" ,e);
throw new RuntimeException(e);
}
while ( true ) {
final Socket socket;
try {
socket = serverSocket.accept();
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
try {
// ¿se ha recibido stop ?
final BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream()));
final String line = in.readLine();
if (line != null && "stop" .equals(line.trim().toLowerCase())) {
// se ha recibido stop... entonces break!
logger .info( "Se ha Recibido Stop..." );
break ;
} else {
logger .info( "Invalid '" + line + "'" );
}
} catch (IOException ioe) {
logger .error(ioe);
} finally {
try {
socket.close();
} catch (IOException ioe) {
logger .error(ioe);
}
}
}
// Se ha recibido un stop
// y se hizo un break dentro del while...
try {
serverSocket.close();
} catch (IOException e) {
logger .error(e);
}
// --
// - cerrar aplicacion
// ...........
System.exit(0);
// ----
}
/**
* Envio stop al socket
*/
private static void stop() throws Throwable {
Socket socket = new Socket(Inet4Address.getLocalHost(), port );
PrintWriter out = new PrintWriter(socket.getOutputStream(), true );
logger .info( "Send stop..." );
out.write( "stop\n" );
out.flush();
out.close();
socket.close();
}
}
#mobile app