java - 多线程服务器: SwingWorker Vs Thread?

标签 java multithreading swingworker

全部在标题中: 我创建了一个java客户端,当我单击按钮时,它会向服务器发送一条消息,多个客户端可以同时连接,这是我的源代码:

客户:

  private void simulerMessageActionPerformed(java.awt.event.ActionEvent evt) {                                               
    try {
        log.append("wait for connexion..\n");
        socket=new Socket(ip.getText(),Integer.parseInt(port.getText()));

        log.append("Connexion to the server ok");

         BufferedReader in = new BufferedReader( new  InputStreamReader(socket.getInputStream())  ); ligne.      
         PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); 


         String str = "test1";
         log.append("\n"+str+"\n");
         out.println(str); 


         in.close();
         out.close();
         socket.close();
    } catch (UnknownHostException ex) {
        Logger.getLogger(Simulator.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Simulator.class.getName()).log(Level.SEVERE, null, ex);
    }






  }             

服务器:

  private void demarreActionPerformed(java.awt.event.ActionEvent evt) { 
  sw=new SwingWorker<String,Void> (){

  protected String doInBackground() throws Exception {
    try {

            server = new ServerSocket(Integer.parseInt(port.getText()));
      } catch (IOException ex) {
    return "already in use";

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

            log.append(str1+"\n");
            PrintWriter out=null;
            BufferedReader in=null;
            Socket socClient=null;
     while(ecoute){
       try{
          socClient = server.accept();  
         }catch(java.net.SocketException e){

           return "[user] Server Stoped";
          }
                    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");



         }



     return "fatal error";
       }

       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();
   }   

目前,当我发送消息时,我的服务器包含一个小错误,它可以工作,但之后所有收到的消息都是空的......请参阅: enter image description here

我认为问题来自于我在 server 中的 socClient = server.accept(); 之后没有创建线程? 如果是这样的话,什么是最好的?:

  • 在 SwingWorker 中使用 SwingWorker。

  • 使用 Runnable 接口(interface)创建经典线程。

否则有什么解决方案可以解决这个问题? 谢谢^^。

最佳答案

在这种情况下您可能不应该使用 SwingWorker。当准备好更新 GUI 时,您应该让后台处理线程调用 SwingUtilities.invokeLater()。通常,SwingWorker 用于由 GUI 事件启动的操作,例如单击按钮或菜单项,这样 GUI 就不会挂起,并且您可以随着时间的推移获取 GUI 的更新。重要的是确保您的 GUI 更新在 EDT 上完成,SwingUtilities.invokeLater() 将处理该问题。作为基本 Thread/Runnable 的替代方案,也可以看看 Future、Callable 和 Executors,这可能会给您一些如何构造它的想法。 SwingWorker 在内部使用它们。

关于java - 多线程服务器: SwingWorker Vs Thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9600215/

相关文章:

Saxon XPath API 返回 TinyElementImpl 而不是 org.w3c.dom.Node

java - 如何将图像写入共享位置以便于访问?

Java,接口(interface)可以继承吗?

c# - 线程 sleep C#

ruby - 什么时候需要将参数传递给 `Thread.new` ?

java - 在 SwingWorker 中调用 super.approveSelection()

java - 从 JButton actionListener 更新 JLabel

java - 检查(并提取)字符串中数值的外观

java - SwingWorker 调用 JFrame 类 ..window 不显示任何内容

python - 线程问题 使用线程时 Kivy 图像纹理不更新