Java 单例模式-服务器套接字

Java 单例模式-服务器套接字,java,Java,我正在使用这个代码: final int LOCK_PORT= 54321; ServerSocket ss = new ServerSocket(LOCK_PORT); 问题是,在同一个端口中,您无法收听两个不同的应用程序(教师理论) 此代码已在应用程序中实现,同一实例运行了1次以上。目标是不允许同一实例在同一端口中运行超过1次。然而,这是不工作,它确实运行 //编辑,更多代码 public VentanaPropiedades() { initFirst();

我正在使用这个代码:

    final int LOCK_PORT= 54321;
    ServerSocket ss = new ServerSocket(LOCK_PORT);
问题是,在同一个端口中,您无法收听两个不同的应用程序(教师理论)

此代码已在应用程序中实现,同一实例运行了1次以上。目标是不允许同一实例在同一端口中运行超过1次。然而,这是不工作,它确实运行

//编辑,更多代码

public VentanaPropiedades() {
    initFirst();
    initComponents(); //graphic components of Matisse
}

private void initFirst() {
    loadProperties(); //just internal values of the program, nothing to do

    activateInstance();
}

private void activateInstance() throws Exception {
    try {
    final int LOCK_PORT= 54321;
    ServerSocket ss = new ServerSocket(LOCK_PORT);
    } catch (Exception e) {
        System.out.println(e);
        throw e;
    }
}

private void killProgram() {
    setVisible(false);
    dispose();
    System.exit(0);
}

private void validateInstance() {
    try {
        activateInstance();
    } catch (Exception ex) {
        killProgram();
    }
}
--------------------------假设的解决方案--------------------
第二个实例未运行时捕获的错误如下:

 java.net.BindException: Address already in use: JVM_Bind 

但是,此错误并不总是发生,您可以运行同一程序的多个实例。

它不起作用。在第二次尝试创建 插座看看您是否在某个地方意外捕获到它,或者端口是否确实不同
或者类似的东西。

它不起作用。在第二次尝试创建 插座看看您是否在某个地方意外捕获到它,或者端口是否确实不同
或者类似的东西。

必须在方法之外声明ServerSocket,就在main之后:

public class VentanaPropiedades extends javax.swing.JFrame {
    ServerSocket ss = null;
    // ... more code
}
激活方法应使用参考:

private void activateInstance() throws Exception {
    try {
        final int LOCK_PORT= 54321;
        ss = new ServerSocket(LOCK_PORT); // note the missing "ServerSocket" before ss
    } catch (Exception e) {
        System.out.println(e);
        throw e;
    }  
}

问题是,如果在方法中创建变量
ServerSocket
,垃圾收集器将在方法完成后清理它。如果上面声明了变量,垃圾收集器将不会收集和清理它,因为声明的变量将保持实例化,但没有引用

必须在方法外声明ServerSocket,就在main之后:

public class VentanaPropiedades extends javax.swing.JFrame {
    ServerSocket ss = null;
    // ... more code
}
激活方法应使用参考:

private void activateInstance() throws Exception {
    try {
        final int LOCK_PORT= 54321;
        ss = new ServerSocket(LOCK_PORT); // note the missing "ServerSocket" before ss
    } catch (Exception e) {
        System.out.println(e);
        throw e;
    }  
}


问题是,如果在方法中创建变量
ServerSocket
,垃圾收集器将在方法完成后清理它。如果上面声明了变量,垃圾收集器将不会收集和清理它,因为声明的变量将保持实例化,但没有引用

“does run”到底是什么意思?它运行了吗,但是你得到了一个错误?它运行时没有错误吗?当有人试图连接到端口54321时会发生什么情况?哪个实例获得连接?当实例第一次运行时,建议同一端口上的第二个实例不运行,但它确实运行。您可以显示您正在使用的完整代码吗?当您开始第二次运行时,第一次运行可能已经完成了?@Alpha2k您没有回答我的问题。请使用netstat命令查看哪个进程正在占用锁定端口。您所说的“does run”到底是什么意思?它运行了吗,但是你得到了一个错误?它运行时没有错误吗?当有人试图连接到端口54321时会发生什么情况?哪个实例获得连接?当实例第一次运行时,建议同一端口上的第二个实例不运行,但它确实运行。您可以显示您正在使用的完整代码吗?在您开始第二次运行时,第一次运行可能已经完成了?@Alpha2k您没有回答我的问题。请使用netstat命令查看哪个进程正在占用锁定端口。它或多或少可以工作,我可以正确捕获异常。。。但这并不总是发生……如果你可以毫无例外地创建套接字,那就意味着另一个套接字不再绑定。这不是java的东西,你的操作系统给了你这个。尝试使用netcat或其他工具,您会发现它也不起作用。@Alpha2k仅仅因为捕获了异常并不意味着它起作用。如果出现异常,则说明有错误。@Aplha2k,对不起,似乎其他人报告windows上的此操作不可靠。我不知道。它或多或少起作用,我可以正确地捕捉异常。。。但这并不总是发生……如果你可以毫无例外地创建套接字,那就意味着另一个套接字不再绑定。这不是java的东西,你的操作系统给了你这个。尝试使用netcat或其他工具,您会发现它也不起作用。@Alpha2k仅仅因为捕获了异常并不意味着它起作用。如果出现异常,则说明有错误。@Aplha2k,对不起,似乎其他人报告windows上的此操作不可靠。我不知道。