Bom dia, estou criando com serversocket porta para não deixar o programa java carregar mais de uma vez. Em Alguns windows funciona normalmente e em outros não alguem tem alguma ideia do que pode estar acontecendo. Na verdade no que nao funciona não esta criando a porta que usei 9963.
try {
new ServerSocket(9963); //escolha sua porta
}catch(Exception e) {
JOptionPane.showMessageDialog(this, “Sistema já aberto, Minimizado”,
“Mensagem”, JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
Como que você vai saber o que está acontecendo se nem a mensagem da exceção vc exibe? Essa porta está liberada no firewall do sistema operacional da máquina?
obrigado por responder. Logo inicio do programa faço o serversocket na porta 9963
ai se eu tentar carregar o mesmo programa de novo faço a exceção com mensagem
que ja esta aberto e minimizado e dou System.exit(0). Para não ficar com dois ou
mais abertos. Já testei em alguns micros e funcionou mas em outro não pois não
cria a porta 9963. Verifiquei com netstat -ano que mostra as portas no windows.
o que mais vejo são aplicações que criam arquivos temporários e fazem o lock quando o arquivo já existe. Não compensa pra vc fazer igual?
Oloco bicho, que gambiarra meu amigo… Veja o exemplo abaixo (está comentado).
import java.awt.*;
import java.awt.event.*;
import java.util.prefs.*;
import javax.swing.*;
public class App extends JFrame {
// cria ou obtem um nó de preferências no sistema operacional
private static final Preferences PREFS = Preferences.userRoot().node( "nome_da_app" );
// uma chave para identificar o status da aplicação
private static final String APP_ABERTA = "aberto";
public App() {
setDefaultCloseOperation( EXIT_ON_CLOSE );
setTitle( "Aplicação..." );
setSize( 200, 200 );
add( new JLabel( "Aplicação..." ), BorderLayout.CENTER );
setLocationRelativeTo( null );
addWindowListener( new WindowAdapter() {
@Override
public void windowClosing( WindowEvent e ) {
// quando a janela fechar, armazena que a aplicação não está aberta
PREFS.putBoolean( APP_ABERTA, false );
}
});
}
public static void main( String args[] ) {
// em caso de fechamento inesperado, pode-se resetar o status
// passando o argumento "reset" na linha de comando
// algo assim: javaw App reset ou então javaw -jar App.jar reset
if ( args.length > 0 ) {
if ( args[0].equals( "reset" ) ) {
PREFS.remove( APP_ABERTA );
}
}
// se a aplicação não está aberta
if ( !PREFS.getBoolean( APP_ABERTA, false ) ) {
// armazena o status aberto
PREFS.putBoolean( APP_ABERTA, true );
// abre a janela e continua...
EventQueue.invokeLater( new Runnable() {
public void run() {
new App().setVisible( true );
}
});
// se a aplicação já está aberta
} else {
JOptionPane.showMessageDialog(
null,
"A aplicação já está aberta!",
"Alerta",
JOptionPane.WARNING_MESSAGE );
System.exit( 1 );
}
}
}
Obrigado pela atenção, vou testar
o exemplo que me passou esta funcionando. Fiz alteracões com base no que me passou mas
quando executo só entra no if da A aplicação já está aberta!.
quando mudo o teste do
if ( !PREFS.getBoolean( APP_ABERTA, false ) ) {
para
if ( PREFS.getBoolean( APP_ABERTA, false ) ) {
ai carrega mais de uma vez.