我正在創建一個多線程的聊天服務器,應該爲每個連接的客戶端創建一個單獨的線程。每次客戶端連接時,我的服務器都會創建一個客戶端處理程序類的新實例,該實例應該跟蹤來自/發往特定客戶端的進出消息。創建一個echo服務器 - 服務器只能響應一次
客戶端第一次連接到我的回顯服務器時,服務器將回應客戶端響應的迴應。但是,如果我嘗試再次向服務器發送消息,則客戶端會創建IOException。我自己創建了客戶端應用程序,但我知道它可行,因爲我可以很好地與其他服務器通信。我很確定問題出在這個客戶端處理程序類的運行方法的某個地方,但我無法弄清楚它爲什麼不起作用。下面是我的客戶端處理程序類的run方法:
public void run() {
try (
BufferedReader in =
new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream());
) {
long time = System.currentTimeMillis();
out.println("Server - " + time + ": " + in.readLine());
out.close();
try {
in.close();
} catch (IOException e) {
System.err.println("Couldn't close input stream");
}
} catch(IOException e) {
System.err.println("Got an IOException error while reading or writing from/to client");
}
}
我猜我應該有某種while循環的地方,但我所有的努力來實現這個的都失敗了。例如。我試圖改變這種代碼:
long time = System.currentTimeMillis();
out.println("Server - " + time + ": " + in.readLine());
要這樣:
String inputLine;
while((inputLine = in.readLine()) != null) {
long time = System.currentTimeMillis();
out.println("Server - " + time + ": " + inputLine);
}
該解決方案是多還是少的甲骨文網站(http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html)怎麼說,它應該做的副本。
我認爲主要問題可能是我沒有真正掌握服務器/客戶端通信的整個概念,所以我們將非常感謝您向正確的方向發展。
提前致謝!
我不是服務器方面的專家,但我認爲在客戶端處理程序類中存在某種「保持活動」循環。因此,如果客戶端連接並且第一次ping從客戶端發送到服務器,則會調用客戶端處理程序的運行方法。但是,在運行完第一次ping之後,接下來會發生什麼?該方法結束,線程停止,您的客戶端再也沒有遠端端點進行通信。例如,我的意思是,看看這個鏈接:http://wrapper.tanukisoftware.com/doc/german/app-hello-world-server.html - > HelloWorldServer.java有這行'while(true)'。你需要這個。 – Korashen 2014-09-24 07:56:48
@Korashen問題出在服務器上而不是客戶端 - 示例中的服務器只能監聽單個客戶端連接 – 2014-09-24 08:19:58
從OP的文章中我瞭解到,ClientHandler.class是服務器上的一個Runnable,將爲每個服務器立即執行連接的客戶端。正如我已經寫過的,在第一次握手之後,run()結束並且新創建的線程終止。這是我對帖子的理解,但我可能是錯的,不知道...... – Korashen 2014-09-24 08:38:10