2013-04-19 23 views
0

由於某些原因,當我運行我的服務器代碼時,服務器窗口彈出,但然後它凍結,並且不允許我做任何事情。我用我的代碼進行了實驗,似乎while循環是問題所在,因爲當我刪除它時,它工作正常。但我需要while循環爲許多客戶端提供服務。以下是代碼:試圖在Java中製作多個客戶端服務器?

注意:變量numClients已被初始化並在其他地方實例化。

try{ 

     ServerSocket serverSocket = new ServerSocket(8000); 
     textArea.append("Server started on " + new Date() + "\n");   

     while(numClients <= 5){ 

     Socket socket = serverSocket.accept(); 

     InetAddress inetAddress = socket.getInetAddress(); 

      textArea.append("Client \"" + inetAddress.getHostName() + "\" has       
          connected!"); 
     textArea.append("The IP address of \"" + inetAddress.getHostName() +  
         "\" is " + inetAddress.getHostAddress());  

     HandleClient task = new HandleClient(socket); 
     new Thread(task).start(); 

     numClients++; 

    } 
} 
catch(IOException ex){ 
    ex.printStackTrace(); 
} 

回答

0

方法調用:serverSocket.accept()阻塞,這意味着它會停止當前線程,直到有人連接。這意味着如果正在讀取輸入的同一個線程中完成,則不會收到用戶輸入。

這意味着,如果沒有while循環,您將收到一個連接,離開這個代碼, 但與while循環,你會繼續阻止和接收新的連接。

要解決您的問題,您需要在單獨的線程上運行while循環。

0

發生什麼事情是當您撥打Socket socket = serverSocket.accept();線程'塊',直到它收到連接Socket。並導致您的GUI和Socket包含在同一個線程中,您的GUI看起來沒有響應。

你想要做的是查看線程並在單獨的線程中將連接接受代碼運行到GUI。這樣,您的GUI仍然獨立於您的Socket線程,並且在您的Socket正在等待連接時不會被阻止。

相關問題