2012-03-06 27 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