2013-05-27 2 views
5

사용자가 GUI를 사용하여 서버를 켜거나 끌 수있는 클라이언트 - 서버 응용 프로그램을 만들고 있습니다. 그것을 작동 시키려면 SwingWorker 중첩 클래스를 사용합니다. 모두 제대로 작동하는 것처럼 보입니다. 그러나 서버를 껐다가 다시 켜면 작동하지 않습니다. 아마도 다른 인스턴스를 덮어 쓸 수 없기 때문에 가능할 것입니다. 서버가 수락되면 차단됩니다) 방법. 사용자가 스위치 끄기 버튼을 눌렀을 때 이전 인스턴스를 중지하려고하지만 어떻게 작동하는지 알 수 없습니다. 여기 다른 클래스의 클래스 인스턴스를 어떻게 죽입니까?

나에게 문제를 제공하는 SwingWorker의 클래스의 :

class SwingWorkGUI extends SwingWorker 
    { 
     @Override 
     protected Integer doInBackground() throws Exception { 
      int delay = 1000; 
      final Timer time = new Timer(delay, null); 
      time.addActionListener(new java.awt.event.ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (Server.up == true){ 
         upTimeMillis += 1000; 
         long diff = upTimeMillis/1000; 
         long numHrs = diff/60; 
         diff = diff%60; 
         long numMins = diff/60; 
         long numSecs = diff%60; 
         upTime.setText(numHrs + ":" + numMins + ":" + numSecs); 
        } 
        else { 
         upTime.setText("Server Actually Down"); 
         time.stop(); 
        } 
       }   
      }); 
      time.start(); 
      mainServer = new Server(); 
      return null; 
     } 
    } 

매번 버튼 켜기를 누를 때의의 actionPerformed하지

SwingWorkGUI swg = new SwingWorkGUI(); 
swg.execute(); 
를 실행하는 경우 서버가 다음에 대한 여부를 이미 여부를 결정

실행 블록은 다음 명령어에서 호출되지만 두 번째 (세 번째 계산 시간) 호출됩니다.

mainServer = new Server(); 

Server.up은 서버에서 while (true) 메소드를 종료하는 데 도움이되는 정적 변수입니다.

모든 응용 프로그램을 닫지 않고 열린 인스턴스를 삭제하려면 어떻게해야합니까?

+0

별도의 스레드에서 서버를 실행하는 경우. 이렇게하면 서버가 무엇을 하던지 종료하게됩니다. (당신은 또한'InterruptedException'을'Server'에서 잡아서 필요에 따라 내부 정리를하고 싶을 것입니다.) – SamYonnou

+0

외부 스레드에서'socket.close()'를 호출하여'socket.accept()'메소드를 중단하고 서버를 종료하십시오 : http://stackoverflow.com/questions/2983835/how-can-i-interrupt- a-serversocket-accept-method – DannyMo

답변

0

정확하게 이해한다면 ServerSocket 개체는 accept() 호출에서 차단되고 차단을 해제해야한다는 점이 문제입니다. 일부 옵션 : 다른 스레드에서

  1. 전화 ss.close()은 (ssServerSocket 객체라고 가정). 이렇게하면 accept()SocketException입니다. 참조 : Javadocs for ServerSocket.close()

  2. 다른 스레드에서 새 Socket을 만들고 자신의 서버에 연결하십시오. 이렇게하면 accept() 호출의 차단이 해제됩니다. 이제 Server.up 깃발을 확인할 수 있습니다.

  3. 예 : ServerSocket에 시간 초과를 설정하십시오. 5 초. 이렇게하면 accept()InterruptedIOException을 시간 초과로 설정합니다. 참고 : 당신이 스레드에 대한 참조를 저장하고 그것을`인터럽트()`를 호출 한 다음 서버에 대한 참조를 정리할 수 Javadocs for SO_TIMEOUT

관련 문제