Liny_@NotePad

沉迷ACG中

同时只能运行一个程序实例的实现

YOYO posted @ 2009年4月28日 23:06 in 【Java SE】 with tags 单实例 , 3062 阅读

做软工作业的机房管理系统,各个计算机要有一个监听自身信息的客户端,于是就牵出了一个同时只能运行一个实例的问题。

其实想想也很简单。因为对于现在应用的各个操作系统,都有端口存在,而一个端口只能被一个程序所占用,

因此,在实例化之前只需要启动一个Socket去连接该应用程序所占用的端口,如果能连接上表示该端口已经启动了一个ServerSocket,

不能连接上则启动一个ServerSocket来占用它即可。

但是有个小缺陷:有可能别的程序也占用了该端口,因此很考验RP 。 - -

下面是简单的实现:

【InstanceController】

  1. package org.banana.control;
  2.  
  3. import java.io.IOException;
  4.  
  5. public class InstanceController extends Thread {
  6.  
  7.         int port;
  8.        
  9.         public InstanceController(int port){
  10.                 this.port = port;
  11.         }
  12.        
  13.         public boolean check(){
  14.                 try {
  15.                         Socket socket = new Socket("127.0.0.1", port)//        向应用程序端口创建连接
  16.                        
  17.                         //      如果能够连接,说明该端口已被相同应用占用。
  18.                         JOptionPane.showMessageDialog(null, "相同程序已在运行!", "错误", JOptionPane.PLAIN_MESSAGE);
  19.                         System.exit(0);
  20.                 } catch (UnknownHostException e) {
  21.                         //e.printStackTrace();
  22.                 } catch (IOException e) {
  23.                         //e.printStackTrace();
  24.                 }
  25.                 return true;
  26.         }
  27.        
  28.         @Override
  29.         public void run() {
  30.                 //      创建服务线程
  31.                 try {
  32.                         ServerSocket server = new ServerSocket(port);
  33.                         while(true){
  34.                                 server.accept();
  35.                         }
  36.                 } catch (IOException e) {
  37.                         e.printStackTrace();
  38.                 }
  39.         }
  40.  
  41. }
 【Main】
  1. package org.banana;
  2.  
  3. import org.banana.control.InstanceController;
  4. import org.banana.view.LoginDialog;
  5.  
  6. public class Main {
  7.  
  8.         /**
  9.          * @param args
  10.          */
  11.         public static void main(String[] args) {
  12.                 InstanceController controller = new InstanceController(1989);// 实例监听线程
  13.                 if(controller.check())controller.start();
  14.                 new LoginDialog();
  15.         }
  16.  
  17. }

【LoginDialog】

  1. package org.banana.view;
  2.  
  3. import javax.swing.JDialog;
  4.  
  5. public class LoginDialog extends JDialog {
  6.        
  7.         public LoginDialog(){
  8.                 this.setSize(300,200);
  9.                 this.setTitle("登陆");
  10.                
  11.                 // Other..
  12.                
  13.                 this.setVisible(true);
  14.         }
  15.  
  16. }

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter