私は一度に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();
}
}
そして、ここでは、サーバ・クラスですデータが渡され、プログラムは読み込みを停止します。プログラムが閉じられるまでソケットを聞かせるにはどうすればいいですか?
新しいスレッドが必要ですか?プログラムは余分なものなしで正常に動作します。私は何も休止していないことを意味する。 –
if()メソッドの後にmain()メソッドで新しいコードを追加した場合と同じように、スレッドを追加しました。checkInput()メソッドが再帰的に呼び出されると実行されません。したがって、ちょうどその場合には、再帰的メソッドをスレッドに追加することが賢明でしょう。そして、後でmainにコードの行がなくなることが確実であれば、スレッドの部分を無視することができます。 –