2011-08-03 93 views
0

這是Java的信使項目的一部分連接。由於客戶端使用直接連接進行聊天,因此我希望eavry客戶端在某個端口上偵聽,而其他客戶端則需要爲該地址創建一個套接字。但是當我在另一個線程中調用ServerSocket.accept()時,看起來所有的線程都被掛起了。這意味着執行該命令後會發生nothings。這是創建新線程的代碼。監聽在一個單獨的線程

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上的八個問題,但接受的答案,只是其中之一。這被認爲是粗魯的,除非你真的覺得沒有人充分回答你的任何問題。 – Dan

回答

3

,當我在另一個線程中調用的ServerSocket.accept()似乎 所有線程都被暫停

出現怎麼樣? accept()只阻塞當前線程。你在AWT線程中調用它嗎?例如一個actionPerformed()方法?不要在這些方法中執行任何網絡操作,請使用單獨的線程。

+0

該程序的GUI未正確加載。順便說一下......這段代碼在構造函數中。 –

+0

此代碼位於JFrame的構造函數中。它是否在AWT線程中? –

+0

感謝...你幫了我很多:) –

1

Socket.accept()並阻止當前線程。只有在收到連接後纔會顯示「flag2」。但它只阻止CURRENT線程。

我懷疑你沒有正確運行單獨的線程(你打電話yourThreadHere.start(),而不是.RUN(),對吧?)。

+0

不......我已經更新了問題...ü可以看到。 –

+0

EJP是正確的,您正在AWT/Swing Thread中執行該代碼,這將凍結您的所有程序界面。閱讀AWT/Swing線程模型。 –

+0

嗯......這是什麼線程?此代碼位於JFrame對象的構造函數中。它在AWT/SWING線程中嗎? –