2016-10-01 8 views
1

私は一度に1つのインスタンスしか実行できないJavaでプログラムを作成しようとしています。 これを達成するためにSocketsとServerSocketsを使用しています。プログラムが動作するようになっている方法Java:インスタンスが存在しない場合にのみ起動し、存在する場合はインスタンスを呼び出すアプリケーションを作成するにはどうすればよいですか?

です:任意のパラメータが渡された場合はmainメソッドがチェックする

、それは手段は、それがあることを意味することを失敗した場合、サーバーへの最初のパラメータを記述しようとしますこれは実行中の唯一のインスタンスなので、ServerSocketを開いてフレームを開始します。それが失敗しない場合、アプリケーションはすでに実行されているので、文字列を送信する必要があり、もう1つのインスタンスはそれを読み取って処理できるはずです。

ここでは主な方法です。このコードの半分が働く(一つだけのインスタンスが一度に実行される)、の最初のセットのみが

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) { 
     } 
    } 

} 

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(); 
    } 
} 

そして、ここでは、サーバ・クラスですデータが渡され、プログラムは読み込みを停止します。プログラムが閉じられるまでソケットを聞かせるにはどうすればいいですか?

答えて

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. 
} 

を、あなたのソケットは自動終了します。また、明示的にソケットを閉じる場合は、シャットダウンフックを追加して閉じます。 シンプルなフックはこのように見えます。

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

新しいスレッドが必要ですか?プログラムは余分なものなしで正常に動作します。私は何も休止していないことを意味する。 –

+0

if()メソッドの後にmain()メソッドで新しいコードを追加した場合と同じように、スレッドを追加しました。checkInput()メソッドが再帰的に呼び出されると実行されません。したがって、ちょうどその場合には、再帰的メソッドをスレッドに追加することが賢明でしょう。そして、後でmainにコードの行がなくなることが確実であれば、スレッドの部分を無視することができます。 –

関連する問題