2012-09-06 59 views
0

我正在編寫一個使用套接字進行雙向通信的程序。客戶端程序向用戶提供一些選項,當用戶選擇該選項時,它將被服務器程序處理,並將結果返回給客戶端程序。我在服務器程序中遇到了一些麻煩,因爲如果我將它放入條件語句中,它將不會處理PrintWriter語句,如下圖所示。Java中的PrintWriter套接字程序

客戶:

Socket socket = null; 

    try 
    { 
     System.out.println("Connecting to Server"); 

     socket = new Socket("192.168.0.104", 7003); 
     socket.setSoTimeout(10000); 
     System.out.println("Connected"); 

     DataOutputStream os = new DataOutputStream(socket.getOutputStream()); 

     InputStreamReader userInput = new InputStreamReader(System.in); 
     BufferedReader userBuffer = new BufferedReader(userInput); 

     InputStreamReader serverInput = new InputStreamReader(socket.getInputStream()); 
     BufferedReader serverBuffer = new BufferedReader(serverInput); 
     PrintWriter print = new PrintWriter(socket.getOutputStream(), true); 

     System.out.println("Option 1"); 
     System.out.println("Option 2"); 
     System.out.println("Option 3"); 
     String userOption = userBuffer.readLine(); 

     os.writeBytes(userOption); 

     if (userOption.equals("1")) 
     { 
      String line = serverBuffer.readLine();    
      System.out.println(line);    
     } 

     System.out.println("Closing Client Connection"); 
     serverBuffer.close(); 
     serverInput.close(); 
     print.close(); 
     socket.close(); 
     os.close(); 
     System.exit(0); 

    } 

服務器:

ServerSocket serverSock = null; 
    Socket standSock = null; 

    try 
    { 
     serverSock = new ServerSocket(7003); 
     standSock = serverSock.accept(); 

     InputStreamReader input = new InputStreamReader(standSock.getInputStream()); 
     BufferedReader read = new BufferedReader(input); 
     PrintWriter print = new PrintWriter(standSock.getOutputStream(), false); 

     String dateTime = (Calendar.getInstance()).getTime().toString(); 

    if (read.readLine().equals("1")) 
    { 
     System.out.println("Option 1"); 
     print.println("You're connected to the Server at: " + dateTime); 
    } 

     System.out.println("Closing Server Connection"); 
     read.close(); 
     input.close(); 
     print.close(); 
     standSock.close(); 

    } 

我測試過的用戶輸入從客戶端程序和它正確地得到它,但問題是,如果我移動

print.println("You're connected to the Server at: " + dateTime); 

在條件語句中,程序只是掛起並最終超時,但如果我移動該狀態nt在條件聲明外運行。如果我將它放入條件聲明中,爲什麼它不能工作?

回答

2

客戶端中的os.writeBytes(userOption);永遠不會寫回報。您正在服務器上調用readline(),因此它會等待,直到您輸入回車。您從System.in調用的readline()實際上會丟棄您輸入的返回值,因此永遠不會傳輸。 將+ \n"添加到os.writeBytes(userOption);應該有所斬獲。

可能更好的選擇是實際使用您在客戶端創建的PrintWriter,它會在調用print.println(userOption)後自動刷新StreamBuffer。它不需要額外的\n

1

問題是DataOutputStream只是在換行符或關閉流之後才真正發送信息,但關閉流也會關閉套接字。

我會推薦使用PrintWriter,因爲它更易於管理,特別是在構造函數中,您可以使第二個參數成爲true,因此每當您在該PrintWriter對象上執行println()時,它就會「自動刷新」會自動發送信息。

+0

它是PrintWriter延遲發送,而不是DataOutStream,它是無緩衝的。 – EJP

+0

我同意DataOutStream是無緩衝的,並且PrintWriter默認延遲,但是當您在PrintWriter對象的構造函數中將autoflush設置爲true時,則不會。 –