单例模式 - 服务器套接字

时间:2014-05-06 07:42:04

标签: java

我正在使用此代码:

    final int LOCK_PORT= 54321;
    ServerSocket ss = new ServerSocket(LOCK_PORT);

问题是,在同一个端口,你不能听2种不同的应用(教师理论)。

此代码已在应用程序中实现,同一实例运行时间超过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 

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

2 个答案:

答案 0 :(得分:2)

它不起作用。第二次尝试创建时,应该会出现BindException 插座。看看你是否意外地在某个地方捕获它或者端口实际上是不同的 或类似的东西。

答案 1 :(得分:2)

必须在main:

之后的方法之外声明ServerSocket
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,则垃圾收集器将在方法完成后清除它。如果变量是在上面声明的,那么垃圾收集器不会收集并清理它,因为声明的变量将保持实例化但没有引用。