Criar porta pelo serversocket - Java

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

Obrigado pela resposta

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.