2012-03-07 183 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