同时只能运行一个程序实例的实现
做软工作业的机房管理系统,各个计算机要有一个监听自身信息的客户端,于是就牵出了一个同时只能运行一个实例的问题。
其实想想也很简单。因为对于现在应用的各个操作系统,都有端口存在,而一个端口只能被一个程序所占用,
因此,在实例化之前只需要启动一个Socket去连接该应用程序所占用的端口,如果能连接上表示该端口已经启动了一个ServerSocket,
不能连接上则启动一个ServerSocket来占用它即可。
但是有个小缺陷:有可能别的程序也占用了该端口,因此很考验RP 。 - -
下面是简单的实现:
【InstanceController】
-
package org.banana.control;
-
-
import java.io.IOException;
-
-
-
int port;
-
-
public InstanceController(int port){
-
this.port = port;
-
}
-
-
public boolean check(){
-
try {
-
-
// 如果能够连接,说明该端口已被相同应用占用。
-
//e.printStackTrace();
-
//e.printStackTrace();
-
}
-
return true;
-
}
-
-
@Override
-
public void run() {
-
// 创建服务线程
-
try {
-
while(true){
-
server.accept();
-
}
-
e.printStackTrace();
-
}
-
}
-
-
}
【Main】
-
package org.banana;
-
-
import org.banana.control.InstanceController;
-
import org.banana.view.LoginDialog;
-
-
public class Main {
-
-
/**
-
* @param args
-
*/
-
InstanceController controller = new InstanceController(1989);// 实例监听线程
-
if(controller.check())controller.start();
-
new LoginDialog();
-
}
-
-
}
【LoginDialog】
-
package org.banana.view;
-
-
import javax.swing.JDialog;
-
-
-
public LoginDialog(){
-
this.setSize(300,200);
-
this.setTitle("登陆");
-
-
// Other..
-
-
this.setVisible(true);
-
}
-
-
}