• category: swing folder: SingleInstanceApplication title: ServerSocketを使ってアプリケーションの複数起動を禁止 tags: [ServerSocket, SingleInstance] author: aterai pubdate: 2008-02-18T16:46:47+09:00 description: ServerSocketを使ってポートをロック代わりに使用し、アプリケーションの複数起動を禁止します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTTF6N0NjI/AAAAAAAAAj0/Ld2Nyv4QXsI/s800/SingleInstanceApplication.png

概要

ServerSocketを使ってポートをロック代わりに使用し、アプリケーションの複数起動を禁止します。Java Swing Hacks #68 単一インスタンスのアプリケーションを作る を参考にしています。

サンプルコード

ServerSocket socket = null;
try {
  socket = new ServerSocket(38765);
} catch (IOException e) {
  socket = null;
}
if (socket == null) {
  JOptionPane.showMessageDialog(null, "An instance of the application is already running...");
  return;
}
View in GitHub: Java, Kotlin

解説

Java Swing Hacks #68で紹介されている、ポートをロックとして使用する方法(任意のポートにバインドできるアプリケーションは一つだけ)で、起動できるアプリケーションを一つに制限しています。

上記のサンプルでは、警告ダイアログを表示して二番目のアプリケーションは終了するだけですが、#68のサンプルではポートへの接続要求が来るまで待機し要求が発生するとソケット入力ストリームを開いてコマンドラインオプションを取得する例(タブブラウザなどのように既に起動しているアプリケーションで別のコンテンツを開く場合に使用する)も記述されています。


以下のように、ポートを使用せずにJDK 6にあるAttach APIを使ったり、ロックファイルを使用して起動するアプリケーションの数を制御する方法もあります。

参考リンク

コメント