我正在使用此代码:
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
但是,并非总是会发生此错误,您可以运行同一程序的多个实例。
答案 0 :(得分:2)
它不起作用。第二次尝试创建时,应该会出现BindException 插座。看看你是否意外地在某个地方捕获它或者端口实际上是不同的 或类似的东西。
答案 1 :(得分:2)
必须在main:
之后的方法之外声明ServerSocketpublic 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
,则垃圾收集器将在方法完成后清除它。如果变量是在上面声明的,那么垃圾收集器不会收集并清理它,因为声明的变量将保持实例化但没有引用。