2013-05-27 89 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(); 

執行塊在下面的指令中,但只有第二個(第三個,ecc。)時間被稱爲:

mainServer = new Server(); 

Server.up是一個靜態變量,可以幫助我殺死服務器中的while(true)方法。

如何在不關閉所有應用程序的情況下終止打開的實例?

+0

如果你正在運行在服務器上的一個單獨的線程可以存儲到該線程的引用,並調用'中斷()'就可以了,然後清理參考服務器。這應該導致服務器退出它正在做的任何事情。 (你可能也想捕捉'Server'上的'InterruptedException's並根據需要進行一些內部清理)。 – SamYonnou

+0

從外部線程調用'socket.close()'來中斷'socket.accept()'方法,然後關閉你的服務器:http://stackoverflow.com/questions/2983835/how-can-i-interrupt-一個-的ServerSocket-接受-方法 – DannyMo

回答

0

如果我理解正確,您的問題是ServerSocket對象在accept()呼叫上被阻止,您需要解鎖它。一些選項:

  1. 呼叫ss.close()從另一個線程(假設ss是你ServerSocket對象)。這會讓accept()拋出一個SocketException。參考:Javadocs for ServerSocket.close()

  2. 從另一個線程創建一個新的Socket並連接到您自己的服務器。這將打開accept()呼叫。現在你可以檢查你的Server.up國旗。

  3. 在您的ServerSocket上設置超時,例如, 5秒。這將使accept()在超時時拋出InterruptedIOException。參考:Javadocs for SO_TIMEOUT

相關問題