2016-10-01 1 views
1

한 번에 하나의 인스턴스 만 실행할 수있는 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) { 
     } 
    } 

} 

(하나의 인스턴스 만 한 번에 실행)의 첫 번째 세트 데이터가 전달되고 프로그램이 읽기를 중지합니다. 프로그램을 닫을 때까지 소켓을 들으려면 어떻게합니까?

답변

1

내가 checkInput() 메소드를 사용하면 여기에 클라이언트 연결을 수락합니다. ,

public static void checkInput() 
{ 
    //do something here 
    serverSocket = new ServerSocket(portNumber); 
    //wait for request from client. 
    Socket clientSocket = serverSocket.accept(); 
    // 
    // do your processing here 

    // call checkInput method again. 
    checkInput(); 
} 

이 즉시 시작 다른 인스턴스로, 서버가 요청을 받아 처리를하고 다시 (우리가 다시 cehckInput라는이를 위해) 더 많은 요청을 기다리고 시작 :이 같은 것을보십시오. 또한 주에

()이 추가 :에

public static void main(String[] args) 
{ 
    String fileName = null; 
    if (args.length >= 1) { 
     fileName = args[0]; 
    } 
    if (Singleton.sendSignal(fileName)) 
    { 
     Frame.getFrame().open(fileName); 

     // start the server in a thread so that main method can continue on 
     new Thread() 
     { 
      public void run() 
      { 
       Singleton.checkInput(); 
      } 
     }.start(); 
    } 

    // do your other tasks. 
} 

을 프로그램하여 소켓가 자동으로 주변의 종료시. 또한 명시 적으로 소켓을 닫으려면 종료 훅을 추가하여 닫을 수 있습니다. 간단한 후크는 이렇게 보입니다.

Runtime.getRuntime().addShutdownHook(your thread that will close sockets); 
+0

새 스레드가 필요합니까? 프로그램은 여분의 것없이 잘 작동합니다. 나는 아무것도 멈추지 않는다는 것을 의미한다. –

+0

if() 메서드 다음에 main() 메서드에 새 코드를 추가하는 것처럼 checkInput() 메서드가 재귀 적으로 호출 될 때 실행되지 않습니다. 따라서 경우에 따라 쓰레드에 재귀 적 메소드를 추가하는 것이 현명 할 것이다. 그리고 네, 나중에 메인에 더 이상의 코드 줄이 없다고 확신하는 경우 쓰레드 부분을 무시할 수 있습니다. –