Javaプログラムの1つのインスタンスを開くことができるクラスを作成します。これは、ServerSocketを開くデーモンスレッドを使用します。 TCPポートがすでに使用されていた場合は、インスタンス化時に例外がスローされます。予期しないソケットが閉じられることがある(または開かない)
コードは、通常、LinuxおよびWindowsでは動作します。
は、ここで私が使用していたコードされています
public class SingleInstaceHandler extends Thread {
private static final Logger log = Logger.getLogger(IEPLC_Tool.class);
private boolean finished = false;
@SuppressWarnings("unused")
private ServerSocket serverSocket;
/*
* Constructor
* Generate the server socket.
* If the TCP door was busy throws IOException.
*/
public SingleInstaceHandler() throws IOException {
@SuppressWarnings("unused")
ServerSocket serverSocket = new ServerSocket(44331);
this.setDaemon(true);
this.start();
log.info("Server socket initialized"); //if commented out it works
}
public void run() {
synchronized (this) {
while (!finished) {
try {
log.debug("Server socket goes to sleep");
this.wait();
log.debug("Server socket waken up");
} catch (InterruptedException e) {
log.debug("ERROR while sending SocketThread2 in wait status");
e.printStackTrace();
System.exit(-1);
}
log.info("Server socket end");
}
}
}
public synchronized void shutdown() {
log.debug("SingleInstaceHandler shutdown() caled");
finished = true;
notifyAll();
}
}
は時々、代わりにポートが...任意のアイデアを忙しくされていませんか?
UPPENDEDさらなる試験AFTER:
他の多くのテストを実行しています。ポートが別のSWインスタンスのようなものによって取られた場合、new ServerSocket(44331);
は例外をスローしますが、何らかの理由でポートが取得されない場合でも、このリソースを取得できないことがあります。この場合、例外は発生せず、私は自分のアプリケーションで必要なだけ多くのインスタンスを開くことができます。多分私はスレッドを強制的にポートをロックするいくつかの他の操作を行う必要があります...
何か考えですか?
おかげで、
サント
はどのようにソケットが閉じたままであることを診断するのですか?あなたのクラスに未使用のserverSocketフィールドがあるのはなぜですか? –
このコードはわかりません。なぜあなたは 'ServerSocket'をインスタンス変数に格納しないのですか?もう一度アクセスすることはできません。 – home
私はコマンドnetstat -vatn |を使用します。 grep "44331"私はあなたが2つのソリューションを持って使用する同じソフトウェアのインスタンスにしないことを保証したい場合は、通常のアプリケーション – Stefano