2012-03-07 185 views
1

是所有在标题: 我创建一个Java客户端,将消息发送到服务器,当我点击一个按钮,几个客户端可以同时连接了,这里是我的源代码:多线程服务器:SwingWorker Vs线程?

客户端:

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

我认为问题来自于我在服务器的socClient = server.accept();之后没有创建线程? 如果它是什么是最好的情况:在SwingWorker的

  • 使用SwingWorker的。

  • 用Runnable接口创建一个经典线程。

否则什么是解决方案来克服这个问题? 谢谢^^。

回答

1

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

0

事实上,你需要创建一个循环线程,每个迭代从InputStream读取,类似这样的东西:

//

thread = new Thread(this); 
thread.start(); 

public void run() { 

      while(true){ 
       System.out.println("thread is running"); 
       try { 
        String temp = in.readUTF(); 
        System.out.println(temp); 
        chattArea.append(temp); 
       } catch (IOException e) { 

       } 

      }  
    } 

如果你不这样做,输入将只读取一次

+0

catch(IOException e){}'为什么? – artbristol 2012-03-07 11:42:17

+0

我会试试这个,稍后再回来。谢谢 – 2012-03-07 12:08:27

+0

在客户端和服务器上发送/接收消息之后,您也正在关闭流。据我所知,这意味着在发送消息后,流将关闭,您将无法再次从它们写入/读取 – 2012-03-08 12:55:11