한 번에 하나의 인스턴스 만 실행할 수있는 Java로 프로그램을 만들려고합니다. 소켓 및 서버 소켓을 사용하여이 작업을 수행하려고합니다. 프로그램이 작동하도록되어 어떻게Java : 인스턴스가 존재하지 않는 경우에만 시작하고 존재하는 경우 인스턴스를 호출하는 응용 프로그램을 어떻게 만들 수 있습니까?
는입니다 :
주요 방법은 어떤 매개 변수가 전달 된 경우, 그것은 수단, 즉 것을 의미 실패 할 경우, 서버에 첫 번째 매개 변수를 작성하려고합니다 확인합니다이것은 실행중인 유일한 인스턴스이므로 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) {
}
}
}
(하나의 인스턴스 만 한 번에 실행)의 첫 번째 세트 데이터가 전달되고 프로그램이 읽기를 중지합니다. 프로그램을 닫을 때까지 소켓을 들으려면 어떻게합니까?
새 스레드가 필요합니까? 프로그램은 여분의 것없이 잘 작동합니다. 나는 아무것도 멈추지 않는다는 것을 의미한다. –
if() 메서드 다음에 main() 메서드에 새 코드를 추가하는 것처럼 checkInput() 메서드가 재귀 적으로 호출 될 때 실행되지 않습니다. 따라서 경우에 따라 쓰레드에 재귀 적 메소드를 추가하는 것이 현명 할 것이다. 그리고 네, 나중에 메인에 더 이상의 코드 줄이 없다고 확신하는 경우 쓰레드 부분을 무시할 수 있습니다. –