2011-08-03 14 views
0

これはjavaのメッセンジャープロジェクトの一部です。クライアントはチャットへの直接接続を使用するため、eavryクライアントは一部のポートでリッスンし、他のクライアントはそのアドレスへのソケットを作成します。しかし、別のスレッドでServerSocket.accept()を呼び出すと、すべてのスレッドが中断されているように見えます。これは、そのコマンドを実行した後に何も起こらないことを意味します。ここに新しいスレッドを作るコードがあります。別のスレッドで接続をリッスンする

java.awt.EventQueue.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         while(true){ 
          System.out.println("flag1"); 
          Socket socket = listeningSocket.accept(); 
          System.out.println("flag2"); 
          new Chat(socket).setVisible(true);; 
          jTextArea1.append("successfully connected\n"); 
         } 
        } catch (NullPointerException e) { 
         System.out.println("i know"); 
        } 
        catch (IOException e) { 
         e.printStackTrace(); 
         jTextArea1.append("error in recieving connection\n"); 
        } 
       } 
      }); 

これを解決する方法はありますか?

+0

ほとんどの時間ブロックする必要があります。バスが時々他の人に応答する必要があります –

+1

@kvphxga、あなたはStack Overflowで8つの質問をしましたが、そのうちの1つのみに対する回答は受け入れています。これは、あなたが本当にあなたの質問に適切に回答した人が誰もいないと思わない限り、無礼とみなされます。 – Dan

答えて

3

私はServerSocket.accept(呼び出し)別のスレッドでどのように表示されます すべてのスレッドが

を中断されているように見えますか? accept()は現在のスレッドのみをブロックします。あなたはAWTスレッドで呼びますか?例えばactionPerformed()メソッド?これらのメソッドでネットワーク操作をしないで、別のスレッドを使用してください。

+0

プログラムのGUIが正しく読み込まれていません。ところで...このコードはコンストラクタにあります。 –

+0

このコードはJFrameのコンストラクタにあります。それはAWTスレッド内にありますか? –

+0

ありがとう...あなたは私を助けました:) –

1

Socket.accept()は、現在のスレッドをブロックしません。接続が受信された後にのみ "flag2"が表示されます。しかし、CURRENTスレッドのみをブロックします。

私はあなたが正しく別のスレッドを実行していない疑いがある(右)(.RUNない、あなたがyourThreadHere.startを(呼んでいます)?)。

+0

いいえ...私は質問を更新しました。 –

+0

EJPが正しいです、AWT/Swing Threadでそのコードを実行していると、すべてのプログラムインターフェイスがフリーズします。 AWT/Swingスレッドモデルについて読んでください。 –

+0

ummm ...そのスレッドは何ですか?このコードはJFrameオブジェクトのコンストラクタにあります。それはAWT/Swingスレッドにありますか? –

関連する問題