2012-03-06 26 views
1

我有一個布爾變量來控制服務器的執行(啓動/停止):基於服務器的SwingWorker不會停止

私人布爾ecoute = TRUE;

這裏是我的類:

sw=new SwingWorker<String,Void>(){ 

protected String doInBackground() throws Exception { 
    try { 

      server = new ServerSocket(Integer.parseInt(port.getText())); 

      String str1="waiting for connexion.."; 
      String str2="Connexion ok"; 

      log.append(str1+"\n"); 
      PrintWriter out=null; 
      BufferedReader in=null; 
      Socket socClient=null; 
     while(ecoute){ 

       socClient = server.accept(); 
        log.append(str2+"\n"); 
        in = new BufferedReader(
            new InputStreamReader(socClient.getInputStream()) 
            ); 
        out = new PrintWriter(
        new BufferedWriter(
         new OutputStreamWriter(socClient.getOutputStream())), 
        true); 
        String str = in.readLine(); 
        log.append(str+"\n"); 

     } 

      in.close(); 
      out.close(); 
      socClient.close(); 
      return "***End Reception***"; 
    } catch (IOException ex) { 
     Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
     return "***Error Reception***"; 
    } 

     } 

     protected void done(){ 
     String m=""; 
      try { 
       m=get(); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (ExecutionException ex) { 
       Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     log.append(m+"\n"); 

     } 
    }; 
    sw.execute(); 
    } 

當我點擊按鈕來傳遞變量爲false,我的線程走出無限循環的,沒有任何反應:

private void arretReceptionActionPerformed(java.awt.event.ActionEvent evt) { 


    ecoute=false; 

} 

我換成ecoute=false;通過sw.calcel(true);也沒什麼新意...

有什麼建議嗎?

+1

不會調用'socClient = server.accept();'阻塞,直到建立連接?如果是這樣,那麼布爾將永遠不會被檢查,除非最終解除封鎖。 – 2012-03-06 17:35:52

回答

4

您的ServerSocket是什麼導致循環不終止。儘管「ecoute」是假的,server.accept()將阻塞,直到滿足以下兩個條件之一:

  1. 一個連接到所述的ServerSocket
  2. 將ServerSocket關閉製成。

您需要執行以下兩項操作之一,以便調用server.accept()將停止阻止。請注意,如果您選擇關閉ServerSocket,則會引發IOException。在try塊中調用server.accept()可能會更好,而不是包裝整個doInBackground()函數。

+0

謝謝,我沒有注意server.accept()... – 2012-03-06 18:29:19

+0

是的,完全正確。 – 2012-03-06 20:05:56