2012-03-07 16 views
1

は、すべてのタイトルである: 私はボタンをクリックしたときに、サーバーにメッセージを送信するJavaクライアントを、作成し、複数のクライアントが同じ時間に接続することができ、ここに私のソースコードは次のとおりです。マルチスレッドサーバー:SwingWorkerとスレッド?

クライアント:

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

現在、私はそれが動作するメッセージを送信するときに私のサーバーは、小さな誤差が含まれていますが、その後、すべての受信メッセージがnullです...以下を参照してください。 enter image description here

私はこの問題は、サーバーにsocClient = server.accept();の後にスレッドを作成しなかったと思いますか? それが最善だろう何ケースの場合:?SwingWorkerの中

  • 使用SwingWorkerの。

  • Runnableインターフェイスで古典的なスレッドを作成します。

その他この問題を解決する方法は何ですか? ありがとう^^。

答えて

1

この場合、SwingWorkerを使用しないでください。 GUIを更新する準備ができたら、バックグラウンド処理スレッドでSwingUtilities.invokeLater()を呼び出す必要があります。通常、SwingWorkerは、ボタンやメニュー項目をクリックしてGUIがハングしないようにGUIイベントによって開始されたもののためのものです。重要な部分は、GUIの更新がEDTで行われていることを確認することです。SwingUtilities.invokeLater()がこれを処理します。基本的なThread/Runnableの代替として、Future、Callable、Executorsについても考えてみましょう。 SwingWorkerはそれらを内部的に使用します。

0

確かに、あなたは、これに似たようなループスレッドを作成する必要があり、それぞれが入力ストリームから読み取る反復:あなたはこれを行わない場合は、入力を

//

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

+0

私はこれを試して、後で戻ってきます。ありがとうございます。 –

+0

クライアントとサーバでメッセージを送受信した直後にストリームを閉じています。メッセージが送信された後、ストリームが閉じられ、再度書き込み/読み取りできなくなることを意味します。 –

関連する問題