2016-10-01 8 views
1

我想用Java创建一个程序,一次只能运行一个它的实例。 我正在使用套接字和服务器套接字尝试实现此目的。Java:我如何才能创建一个应用程序,只有当它的一个实例不存在时才会启动,并在实例存在的情况下调用该实例?

程序应该如何工作:

主要方法将检查是否有任何参数都已经过去了,它会尝试的第一个参数写入服务器,如果失败这意味着,这意味着这是唯一运行的实例,所以它将打开ServerSocket并启动框架。如果它没有失败,那么应用程序已经运行,所以它应该发送字符串,另一个实例应该能够读取并处理它。

这里的主要方法:

public static void main(String[] args) { 
    String fileName = null; 
    if (args.length >= 1) { 
     fileName = args[0]; 
    } 
    if (Singleton.sendSignal(fileName)) { 
     Frame.getFrame().open(fileName); 
     Singleton.checkInput(); 
    } 
} 

而这里的服务器类:

public class Singleton { 
    private static final int portNumber = 4243; 
    private static ServerSocket serverSocket; 
    private static Socket clientSocket; 
    private static Socket echoSocket; 

    public static boolean sendSignal() { 
     try { 
      echoSocket = new Socket(InetAddress.getLocalHost().getHostName(), portNumber); 
      PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true); 
      out.write("Open\n"); 
      out.close(); 
      close(); 
      return false; 
     } catch (Exception e) { 
      close(); 
      return true; 
     } 
    } 

    public static void checkInput() { 
     try { 
      renewReader(); 
     } catch (Exception e) { 
      close(); 
     } 
    } 

    public static void renewReader() throws Exception { 
     serverSocket = new ServerSocket(portNumber); 
     clientSocket = serverSocket.accept(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     String inputLine = in.readLine(); 
     if (inputLine.equals("Open")) { 
      Widget.getInstance().setVisible(true); 
     } 
     close(); 
     renewReader(); 
    } 

    public static void close() { 
     try { 
      serverSocket.close(); 
     } catch (Exception e) { 
     } 
     try { 
      clientSocket.close(); 
     } catch (Exception e) { 
     } 
     try { 
      echoSocket.close(); 
     } catch (Exception e) { 
     } 
    } 

} 

虽然半这段代码的工作(只有一个实例同时运行),只有第一套数据正在传递,然后程序停止阅读。如何让套接字听,直到程序关闭?

回答

1

我你checkInput()方法,你曾经在这里接受客户端的连接。尝试是这样的:

public static void checkInput() 
{ 
    //do something here 
    serverSocket = new ServerSocket(portNumber); 
    //wait for request from client. 
    Socket clientSocket = serverSocket.accept(); 
    // 
    // do your processing here 

    // call checkInput method again. 
    checkInput(); 
} 

只要另一个实例它开始,服务器将接受请求,做加工,然后再开始等待更多的请求(此我们再次呼吁cehckInput)。根据计划,您的插座会自动关闭终止

public static void main(String[] args) 
{ 
    String fileName = null; 
    if (args.length >= 1) { 
     fileName = args[0]; 
    } 
    if (Singleton.sendSignal(fileName)) 
    { 
     Frame.getFrame().open(fileName); 

     // start the server in a thread so that main method can continue on 
     new Thread() 
     { 
      public void run() 
      { 
       Singleton.checkInput(); 
      } 
     }.start(); 
    } 

    // do your other tasks. 
} 

在:

而且在main()中添加此。另外如果你想明确地关闭套接字,你可以添加一个关闭钩来关闭它。 一个简单的钩子看起来像这样。

Runtime.getRuntime().addShutdownHook(your thread that will close sockets); 
+0

是新的线程有必要吗?该程序工作正常,没有额外的一个。我的意思是什么都没有停顿 –

+0

为了防万一,我添加了线程,就好像你在if()条件后的main()方法中添加了新的代码,它不会执行,因为checkInput()方法是递归调用的。因此,在线程中添加递归方法是明智的。是的,如果你确信之后不会有更多的代码行,你可以忽略线程部分。 –

相关问题