Я думаю, что ваше предложение об открытии порта для прослушивания при запуске приложения - лучшая идея.
Это очень легко сделать, и вам не нужно беспокоиться о его очистке при закрытии приложения. Например, если вы записываете в файл, но кто-то затем убивает процессы с помощью диспетчера задач, файл не будет удален.
Кроме того, если я правильно помню, нет простого способа получить PID процесса Java изнутри JVM, поэтому не пытайтесь сформулировать решение с использованием PID.
Нечто подобное должно сработать:
private static final int PORT = 9999;
private static ServerSocket socket;
private static void checkIfRunning() {
try {
//Bind to localhost adapter with a zero connection queue
socket = new ServerSocket(PORT,0,InetAddress.getByAddress(new byte[] {127,0,0,1}));
}
catch (BindException e) {
System.err.println("Already running.");
System.exit(1);
}
catch (IOException e) {
System.err.println("Unexpected error.");
e.printStackTrace();
System.exit(2);
}
}
Этот пример кода явно привязывается к 127.0.0.1
, что должно исключать любые предупреждения брандмауэра, поскольку любой трафик на этот адрес должен поступать из локальной системы.
При выборе порта старайтесь избегать одного из упомянутых в списке известных портов . В идеале вы должны сделать используемый порт настраиваемым в файле или с помощью переключателя командной строки в случае конфликтов.