Я пытаюсь создать программу с Java, которая может одновременно запускать только один экземпляр. Я использую Sockets и ServerSockets, чтобы попытаться добиться этого.
Как программа должна работать:
Основной метод проверит, были ли переданы какие-либо параметры, он попытается записать первый параметр на сервер, если это не удастся, это означает, что это единственный запущенный экземпляр, поэтому он откроет ServerSocket, а затем запустит Рамка. Если это не сработает, то приложение уже запущено, поэтому оно должно отправить строку, а другой экземпляр должен иметь возможность прочитать и обработать ее.
Вот основной метод:
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();
}
}
И вот класс сервера:
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) {
}
}
}
Хотя половина этого кода работает (одновременно выполняется только один экземпляр), передается только первый набор данных, а затем программа прекращает чтение. Как я могу заставить сокет слушать, пока программа не будет закрыта?