当前位置: 首页 > 面试题库 >

基于服务器的SwingWorker不会停止

申屠森
2023-03-14
问题内容

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

private boolean 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);新东西…

有什么建议吗?


问题答案:

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

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

您需要执行以下两项操作之一,以便对server.accept()的调用将停止阻塞。提醒您-
如果您选择关闭ServerSocket,则会抛出IOException。最好将对server.accept()的调用包装在try块中,而不是包装整个doInBackground()函数。



 类似资料:
  • 我在使用eureka进行客户端负载平衡时遵循了spring指南: https://spring.io/guides/gs/client-side-load-balancing/ 但是当我关闭了3个服务器实例中的任何一个后,我得到了一个连接拒绝异常。客户端仍然试图向这些服务器发送请求,而不是忽略未通过ping的服务器。当这些服务器被ping时,我会得到一个异常,当客户端试图向这些服务器发送请求时,也

  • OSX 10.13.6 并且(在另一个终端窗口中): 根据mysql.server的MariaDB文档,这两个命令都应该工作。 目前,我正在像这样杀死服务器: 7stud 4544 0.0 0.0 4267752 880 s000 s+1:41 pm 0:00.00 grep mysqld 关闭mariadb服务器的正确方法是什么?

  • 本文向大家介绍基于C#实现Windows服务状态启动和停止服务的方法,包括了基于C#实现Windows服务状态启动和停止服务的方法的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式展示了基于C#实现Windows服务状态启动和停止服务的方法。非常实用。分享给大家供大家参考之用。具体方法如下: 首先先引用: 然后在引用命名空间: 建立服务对象: 服务运行则停止服务: 服务停止则启动服务: 希望

  • 问题内容: Node.js服务器适用于支持回调函数的基于事件的模型。但是我无法理解它比传统的基于线程的服务器(线程等待系统IO)有什么优势。在基于线程的模型的情况下,当线程需要等待IO时,它将被抢占,因此不会消耗CPU周期,因此不会增加等待时间。 Node.js如何改善等待时间? 问题答案: 线程是相对较重的对象,具有资源足迹,一直扩展到内核。当您将线程驻留在阻塞的系统调用中或互斥或条件变量上时,

  • 我使用Spring Boot开发了这个websocket服务器。服务器与基于js的客户机配合得很好。 控制器: 这是服务器端。现在,对于客户机,我已经创建了一个@ClientEndpoint,当我连接到URI“ws://localhost:8080/spring-mvc-java/chat”时,我能够建立一个连接,并且可以看到@ClientEndpoint的@OnOpen回调被触发。 但是,use

  • 问题内容: 我想停止redis服务器,并且它一直在运行。我正在使用redis-2.6.7 检查它是否正在运行: 它显示“ … bind:地址已在使用中”,因此它已在运行。 我努力了 它只是挂起,没有任何反应。我中断检查,是的,它仍在运行。 我努力了 我得到“无法打开配置文件’停止’” 我试过了: 仍在运行。 我想要停止它的原因是,当我尝试通过Python设置或获取值时,它只是挂起了。所以我认为我会