Tôi nghĩ đề xuất của bạn về việc mở một cổng để lắng nghe khi bạn khởi động ứng dụng là ý tưởng tốt nhất.
Rất dễ thực hiện và bạn không cần phải lo lắng về việc làm sạch nó khi bạn đóng ứng dụng của mình. Ví dụ, nếu bạn viết vào một tập tin nhưng một người nào đó sau đó giết chết các quy trình bằng cách sử dụng Task Manager, tập tin sẽ không bị xóa.
Ngoài ra, nếu tôi nhớ chính xác không có cách nào dễ dàng để lấy PID của một tiến trình Java từ bên trong JVM, do đó đừng thử và xây dựng một giải pháp bằng cách sử dụng các PID.
Something như thế này nên làm như lừa:
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);
}
}
mẫu mã này rõ ràng liên kết với 127.0.0.1
mà nên tránh bất kỳ cảnh báo tường lửa, như bất kỳ giao thông trên địa chỉ này phải từ hệ thống địa phương.
Khi chọn một cổng cố gắng tránh một đề cập trong list of Well Known Ports. Bạn nên lý tưởng làm cho cổng được sử dụng cấu hình trong một tập tin hoặc thông qua một chuyển đổi dòng lệnh trong trường hợp xung đột.
Nguồn
2009-05-28 11:32:15
Hầu hết các giải pháp đơn giản nhất :-) java.nio.file khóa thấy hoàn dụ http: // stackoverflow. com/a/20015771/185022 –