2012-03-26 86 views
4

我想用java製作一個多線程的服務器/客戶端應用程序!這個代碼是用於聽()方法在一個類中的該命名Bsocket(iserver.core.socket)封裝的:JAVA - Socket.accept()凍結用戶界面

try { 
    serverSocket = new ServerSocket(port); 
}catch(IOException e){ 
    ui.log(e.toString());//* 
} 
while (true){ 
    try{ 
     clienSocket = serverSocket.accept(); 
     ui.log("Incomming Connection.");//* 
     new connectionHandler(clienSocket, ui); 
    }catch(IOException e){ 
     ui.log(e.toString()); 
    } 
} 

ui.log("Incomming Connection.");是在低於主類Bgui的方法(iserver.core.ui) .Bgui是一個包含textarea和其他東西的jframe。問題是當執行accept方法時,ui.log沒有工作!這裏有什麼不對?

+0

問題充分了解!!!但一些信息是optinal!你喜歡-1嗯? :) 好 !看看'dty'答案! – bizzr3 2012-03-26 12:49:42

+1

你應該看看這個[關於SwingWorkers的教程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html) – assylias 2012-03-26 12:50:08

+0

嘿,我解開了-1,一旦我發現你不知道UI系統如何工作。我對日誌輸出和jframes的討論感到困惑。 – Gray 2012-03-26 13:12:43

回答

4

您需要將UI線程從您自己的網絡服務線程中分離出來。 accept()阻塞(顯然),它凍結你的應用程序,直到你得到一個新的客戶端,並再次凍結等待更多的客戶端。

+0

你能告訴我更多關於分離這些圖層嗎? – bizzr3 2012-03-26 12:52:36

+1

這是一個有很大回應的簡短問題。你需要學習一些關於併發的概念。開發UI應用程序非常重要。 Oracle提供了一些有趣的[與Swing應用程序中的併發相關的教程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 – logoff 2012-03-26 12:57:22

+0

感謝您的關注 – bizzr3 2012-03-26 12:59:50

6

Socket.accept()阻塞,直到有傳入連接接收(請參閱文檔)。你不應該從你的UI線程做任何阻塞調用 - 否則它會......你知道......阻止!

7

由於.accept是一個阻塞呼叫,您將需要在單獨的線程上啓動服務器。你可能想這樣做:

(new Runnable() { 
    @Override 
    public void run() 
    { 
     try { 
       serverSocket = new ServerSocket(port); 
      }catch(IOException e){ 
       ui.log(e.toString());//* 
      } 
     while (true){ 
      try{ 
       clienSocket = serverSocket.accept(); 
       ui.log("Incomming Connection.");//* 
       new connectionHandler(clienSocket, ui); 
      }catch(IOException e){ 
       ui.log(e.toString()); 
      } 
     } 
    } 
}).start(); 

注意:此代碼未經測試,但它應該讓你知道你需要做什麼。