2 回答
TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊
正如 Martin Wickman 在他的評(píng)論中指出的那樣,您需要一個(gè)單獨(dú)的線程。這就是發(fā)生的事情。
您的服務(wù)器接受連接。現(xiàn)在,在處理該連接之前,它不會(huì)執(zhí)行任何其他操作。
所以你的 client1 打開(kāi)到服務(wù)器的連接。這基本上會(huì)占用服務(wù)器(因?yàn)榉?wù)器不是多線程的,也不是以任何其他方式一次處理多個(gè)客戶(hù)端)。在處理完 client1 之前,服務(wù)器不會(huì)執(zhí)行任何其他操作。
要解決此問(wèn)題,您需要?jiǎng)?chuàng)建一個(gè)線程來(lái)處理客戶(hù)端對(duì)話。因此,您的主循環(huán)接受一個(gè)新的連接并將其提供給一個(gè)全新的線程。然后該線程處理該特定連接,并且主循環(huán)返回等待另一個(gè)客戶(hù)端。
TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
服務(wù)器等待第一個(gè)客戶(hù)端發(fā)送句子。這是阻塞線:clientSentence = inFromClient.readLine();
只有在第一個(gè)客戶(hù)端發(fā)送消息后,代碼才會(huì)繼續(xù),然后第二個(gè)客戶(hù)端才真正被處理Socket connectionSocket = welcomeSocket.accept()
解決的方法是在自己的線程中處理每個(gè)客戶(hù)端。簡(jiǎn)單的原始未經(jīng)測(cè)試的示例代碼:
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();
}
}
然后在服務(wù)器中,從accept()調(diào)用獲得套接字后,您啟動(dòng)一個(gè)新線程來(lái)處理客戶(hù)端:
while (true) {
Socket connectionSocket = welcomeSocket.accept();
new Thread(new ClientHandler(connectionSocket)).start();
}
添加回答
舉報(bào)
