2011-10-05 69 views
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(); 
    } 

客戶端代碼基本相同。謝謝你的時間!

回答

1

只要使用兩個線程,除非你想了解NIO。 Java教程提供了產生線程的例子來處理客戶端與ServerSocket的連接。朝"Writing the Server Side of a Socket"的底部看。

+0

謝謝您的回覆。如果我使用這兩個線程,那麼這些調用仍然會被阻塞,但線程將模擬非阻塞調用,對(聽起來好像會起作用)?我不太確定你鏈接的教程是我需要的。應該只有一個客戶端和一個服務器,但客戶端可以一次向服務器發送多條消息,而無需等待答覆。 –

+0

那些電話總是阻止,是的。通過使用一個入站流量線程和一個出站入口流量,它們不必互相等待,因爲整個線程點是它們同時運行,或者至少可以假裝,所以一個線程可以被阻止等待用於輸入/輸出,另一個繼續進行所需的任何操作。你對這個教程是正確的。與我之前的想法不一樣。但是,如果您查看「多服務器」,並想象服務器在創建線程以處理輸入時保留輸出流...... –

相關問題