• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:ServerSocketを使ってアプリケーションの複数起動を禁止
#navi(../)
*ServerSocketを使ってアプリケーションの複数起動を禁止 [#r7f6907f]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2008-02-18~
更新日:&lastmod;
---
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
---
* 概要 [#summary]
`ServerSocket`を使ってポートをロック代わりに使用し、アプリケーションの複数起動を禁止します。[https://www.oreilly.co.jp/books/4873112788/ Java Swing Hacks #68 単一インスタンスのアプリケーションを作る] を参考にしています。

#contents
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTTF6N0NjI/AAAAAAAAAj0/Ld2Nyv4QXsI/s800/SingleInstanceApplication.png)

**概要 [#k89031ec]
ServerSocketを使ってポートをロック代わりに使用し、アプリケーションの複数起動を禁止します。[[Java Swing Hacks #68 単一インスタンスのアプリケーションを作る>http://www.oreilly.co.jp/books/4873112788/toc.html]] を参考にしています。

#screenshot

**サンプルコード [#n456379c]
#code{{
* サンプルコード [#sourcecode]
#code(link){{
ServerSocket socket = null;
try {
  socket = new ServerSocket(38765);
}catch(IOException e) {
} catch (IOException e) {
  socket = null;
}
if(socket==null) {
if (socket == null) {
  JOptionPane.showMessageDialog(null, "An instance of the application is already running...");
  return;
}
}}
-&jnlp;
-&jar;
-&zip;

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

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

----
ポートを使用せずに、JDK 6 にある Attach API を使ったり、ロックファイルを使用して起動するアプリケーションの数を制御する方法もあります。
-参考サイト
--[[PseudoFileSemaphore (アプリケーションのインスタンス数を制御するには-その3) - KazzzのJとNのはざまで>http://d.hatena.ne.jp/Kazzz/20071218/p1]]
--[[Attach API (アプリケーションのインスタンス数を制御するには-その4) - KazzzのJとNのはざまで>http://d.hatena.ne.jp/Kazzz/20071221/p1]]
- 以下のリンクのようにポートを使用せず`JDK 6`にある`Attach API`を使ったり、ロックファイルを使用して起動するアプリケーションの数を制御する方法もある
-- [https://kazzz.hatenablog.com/entry/20071218/p1 PseudoFileSemaphore (アプリケーションのインスタンス数を制御するには-その3) - KazzzのJとNのはざまで]
-- [https://kazzz.hatenablog.com/entry/20071221/p1 Attach API (アプリケーションのインスタンス数を制御するには-その4) - KazzzのJとNのはざまで]

**参考リンク [#f479b3e9]
-[[Java Swing Hacks #68 単一インスタンスのアプリケーションを作る>http://www.oreilly.co.jp/books/4873112788/toc.html]]
* 参考リンク [#reference]
- [https://www.oreilly.co.jp/books/4873112788/ Java Swing Hacks #68 単一インスタンスのアプリケーションを作る]
- [[SingleInstanceServiceを使って Web Start アプリケーションの重複起動を禁止>Swing/SingleInstanceService]]
-- `javax.jnlp.SingleInstanceService`を使用して複数起動を禁止する

**コメント [#w03a2a60]
* コメント [#comment]
#comment
#comment