【问题标题】:Server based SwingWorker does not Stop基于服务器的 SwingWorker 不会停止
【发布时间】:2012-03-24 05:12:57
【问题描述】:

我有一个布尔变量来控制服务器的执行(启动/停止):

私有布尔 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); 也没什么新东西...

有什么建议吗?

【问题讨论】:

  • 这个调用socClient = server.accept(); 不会阻塞直到建立连接?如果是这样,那么除非最终解除阻塞,否则永远不会检查布尔值。

标签: java swing sockets swingworker cancellation


【解决方案1】:

您的 ServerSocket 是导致循环不终止的原因。即使 'ecoute' 为 false,server.accept() 也会阻塞,直到满足以下两个条件之一:

  1. 与 ServerSocket 建立连接
  2. ServerSocket 已关闭。

您需要做这两件事之一,以便对 server.accept() 的调用停止阻塞。请注意 - 如果您选择关闭 ServerSocket,则会抛出 IOException。最好将 server.accept() 的调用包装在 try 块中,而不是包装整个 doInBackground() 函数。

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多