2 回答

TA貢獻1946條經驗 獲得超4個贊
正如 Martin Wickman 在他的評論中指出的那樣,您需要一個單獨的線程。這就是發生的事情。
您的服務器接受連接。現在,在處理該連接之前,它不會執行任何其他操作。
所以你的 client1 打開到服務器的連接。這基本上會占用服務器(因為服務器不是多線程的,也不是以任何其他方式一次處理多個客戶端)。在處理完 client1 之前,服務器不會執行任何其他操作。
要解決此問題,您需要創建一個線程來處理客戶端對話。因此,您的主循環接受一個新的連接并將其提供給一個全新的線程。然后該線程處理該特定連接,并且主循環返回等待另一個客戶端。

TA貢獻1825條經驗 獲得超4個贊
服務器等待第一個客戶端發送句子。這是阻塞線:clientSentence = inFromClient.readLine();
只有在第一個客戶端發送消息后,代碼才會繼續,然后第二個客戶端才真正被處理Socket connectionSocket = welcomeSocket.accept()
解決的方法是在自己的線程中處理每個客戶端。簡單的原始未經測試的示例代碼:
public class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
public void run() {
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(socket.getOutputStream());
clientSentence = inFromClient.readLine();
clientSentenceLength = clientSentence.length();
outToClient.writeBytes(clientSentenceLength + "" + '\n');
socket.close();
}
}
然后在服務器中,從accept()調用獲得套接字后,您啟動一個新線程來處理客戶端:
while (true) {
Socket connectionSocket = welcomeSocket.accept();
new Thread(new ClientHandler(connectionSocket)).start();
}
添加回答
舉報