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上的此操作不可靠。我不知道。