4

基本的にシステムトレイで実行されるデスクトップJavaアプリケーションを作成しています。このアプリケーションは、コマンドラインパラメータを受け入れることができます。実行中のアプリケーションのインスタンスがあり、コマンドライン引数を使用して別のインスタンスが呼び出された場合、それは単にシステムトレイの実行中のプロセスに渡されます。

私はこれをどのように実装するかについて非常に迷っていますか?いくつかのアプリがそれを行うのを見たことがありますが、名前を覚えていません。渡したいのは文字列引数だけで、それから終了します。

4

6 に答える 6

2

このソリューションの実装には2つの部分があります。

  1. 実行中のプログラムのインスタンスがすでに存在するかどうかの検出
  2. プログラムがすでに実行されている場合は、String引数をプログラムに渡します

ソケットを使用して、1と2の両方を同時に実行できます。

あなたができることは、あなたのプログラムが開始されたときにあなたのプログラムにポートをリッスンさせることです。プログラムの別のインスタンスを起動すると、同じポートをリッスンしようとします。ポートが占有されている場合は、プログラムのインスタンスがすでに実行されていると見なすことができます。もちろん、どのアプリケーションでも一般的に使用されていないポートを選択する必要があります。

次に、すでに開始されているプログラムのインスタンスがある場合は、Socketsを使用してString引数を渡します。

于 2012-06-14T06:40:27.717 に答える
2

言い換えれば、アプリケーションをシングルトンにする必要があります。ユーザーがアプリケーションのさらに別のインスタンスを実行しようとすると、既存のインスタンスに何らかのコマンドを送信する必要があります。

あなたは次のようにそれを行うことができます。

起動時にアプリケーションは、選択したポートへのサーバーソケットを開く必要があります。成功した場合は、開始する必要があります。これは、アプリケーションの最初のインスタンスです。失敗した場合は、ポートがすでにビジーであることを意味しているため、アプリケーションの他のインスタンスがそれをリッスンしています。この場合、このソケットに接続し、コマンドを送信して終了します。

ポート番号を選択するときは注意してください。十分な高さ(> 10000)である必要があり、他の一般的なアプリケーションでは使用しないでください。いくつかの番号を選択し、それをグーグルしてみてください。

于 2012-06-14T06:41:10.100 に答える
2

基本的には、起動時にローカルポートにバインドし、失敗した場合はローカルポートに接続してパラメータを送信するという考え方です。

public class StartOnce {

  public static void main(String args[]) throws IOException {
    SocketAddress addr = new InetSocketAddress("127.0.0.1", 9999);

    try {
        ServerSocket ss = new ServerSocket();
        // tries to bind to localhost:9999
        ss.bind(addr);
        // Ok, I'm the first instance, listen for other instances for update.
        while(true) {
            Socket s = ss.accept();
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
            s.close();
        }
    } catch (BindException e) {
        // BindException, tries to send message to the first instance.
        System.out.println("Another instance is running. Say hi.");
        Socket s = new Socket();
        s.connect(addr);
        PrintWriter pw = new PrintWriter(s.getOutputStream());
        pw.println("Hello.");
        for (String arg : args) {
            pw.println(arg);
        }
        pw.close();
        s.close();
    }
  }
}
于 2012-06-14T06:53:40.860 に答える
0

これを実現する方法は複数あります。Javaでは、そのようなことにJMSを使用できます。Springを使用している場合は、このためのテンプレートがあります。これは、JMSの使用を開始する方法に関するチュートリアルです。

または、Sockets、またはRMIを使用して、複数のプロセス内でデータを交換することもできます。

于 2012-06-14T06:37:13.840 に答える
0

ある種のプロセス間通信を実行する必要があります。これを達成するために使用できるテクノロジーは数多くあります。

  • ソケット
  • ウェブサービス
  • Java Remote Method Invocation(RMI)
  • データベースを使用する
  • ファイルへの書き込み

(通常のファイルではなく、パイプという名前のPOSIXのようなものを使用している場合を除いて、ファイルへの書き込みはIPCには適していません)。

于 2012-06-14T06:40:23.107 に答える
0

別のオプションは、別のプロセスで実行されるキャッシュを使用することです。

于 2019-01-09T22:25:25.117 に答える