0
我一直在爲我的網絡課程開發一個(相對)簡單的tcp客戶機/服務器聊天程序。我遇到的問題是我正在使用阻止呼叫,如read()
和writeBytes()
。因此,無論何時我嘗試向我的服務器發送消息,服務器都不會將其打印出來,直到將其寫回。對於這種情況,使用一個線程輸入和一個線程輸出是最明智的解決方案,或者使用NIO更好地服務於我?只是爲了讓您瞭解我的代碼現在的樣子,我的服務器是:我應該有兩個線程輸入/輸出或使用NIO?
ServerSocket welcomeSocket = new ServerSocket(port);
DataOutputStream output;
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
System.in));
String sentence;
while ((sentence = inFromUser.readLine()) != null) {
Socket connectionSocket = welcomeSocket.accept();
output = new DataOutputStream(connectionSocket.getOutputStream());
output.writeBytes(sentence + "\n");
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
connectionSocket.getInputStream()));
System.out.println("Client said: " + inFromServer.readLine());
connectionSocket.close();
}
客戶端代碼基本相同。謝謝你的時間!
謝謝您的回覆。如果我使用這兩個線程,那麼這些調用仍然會被阻塞,但線程將模擬非阻塞調用,對(聽起來好像會起作用)?我不太確定你鏈接的教程是我需要的。應該只有一個客戶端和一個服務器,但客戶端可以一次向服務器發送多條消息,而無需等待答覆。 –
那些電話總是阻止,是的。通過使用一個入站流量線程和一個出站入口流量,它們不必互相等待,因爲整個線程點是它們同時運行,或者至少可以假裝,所以一個線程可以被阻止等待用於輸入/輸出,另一個繼續進行所需的任何操作。你對這個教程是正確的。與我之前的想法不一樣。但是,如果您查看「多服務器」,並想象服務器在創建線程以處理輸入時保留輸出流...... –