2012-09-11 84 views
1

我有一個程序,基本上返回一個字符串,可以有時一行(工作正常),但其他時間可能是多行,這會導致我的問題。基本上我有用戶選擇一個選項發送到第二個程序,並根據該選項它返回一個特定的字符串。但是,如果我把用戶選擇放到我的循環之外,如果返回的字符串是多行的話,它會正常工作,但我需要它通過選項菜單繼續提示用戶,直到他們選擇退出。下面是該代碼:處理多行字符串返回

System.out.print("Enter your choice: "); 
fromClient = stdIn.readLine().trim(); 

while ((fromServer = input.readLine()) != null) 
    { 
     System.out.println("Server: " + fromServer);    
     if (fromServer.equals("Bye")) 
     break;   


     if(fromClient.equals("1")) 
     { 
      System.out.println("Client: " + fromClient); 
      output.println(fromClient); 

     } 
     if(fromClient.equals("2")) 
     { 
      System.out.println("Client: " + fromClient); 
      output.println(fromClient); 

     } 
     if(fromClient.equals("3")) 
     { 
      System.out.println("Client: " + fromClient); 
      output.println(fromClient); 

     } 
     if(fromClient.equals("4")) 
     { 
      System.out.println("Client: " + fromClient); 
      output.println(fromClient); 
      break; 

     } 


    } 

這正如我上面提到返回多行字符串,很好,但它不再做提示用戶進行選項選擇。如果我在循環中移動用戶選擇並返回多行字符串,它將打印一行,要求用戶選擇,打印第二行,要求用戶選擇,打印第三行,要求用戶選擇...

+0

因此,如果我的理解正確,有時來自服務器的響應是一行,有時多行。有什麼標誌着服務器響應的結束嗎? –

回答

1

該代碼相當難以遵循。更多的上下文會很有幫助。什麼是「輸入」? (即來自Server = input.readLine())

無論如何,無論您的服務器發送了多少行,在提示用戶輸入之前,您一次只能讀取1個。嘗試在發送客戶端命令之前處理所有服務器的響應。例如:

boolean shouldExit = false; 

while ((fromServer = input.readLine()) != null){ 
    System.out.println("Server: " + fromServer);      
    if (fromServer.equals("Bye")){ 
     shoudExit = true; 
     break; 
    } 
} 

if (shouldExit) System.exit(0) // Or whatever you want to do 

//Now handle sending your client's command to the server. 
//... 
+0

輸入來自用戶輸入的整數,如:1,2,3或4.該響應被髮送到服務器程序,該程序根據用戶的選擇返回適當的響應。所有這些答案都是一個班輪,除了選項3,它返回多條線路導致我的問題。對我來說問題就像我剛纔提到的那樣,我需要客戶端程序一次打印出服務器響應,然後再次提示用戶進行選項選擇,但正如您所提到的,我一次只能讀取一行。我試圖弄清楚如何讀回所有這些行並提示用戶。 – Nick

+0

這個答案應該可以解決你的問題。我假設「輸入」(從服務器= input.readLine())是某種緩衝區? – bfishman

+0

是的,它來自一個緩衝區。你還可以更詳細地解釋你的代碼嗎?我很困惑,我可以如何包含用戶選擇部分。 – Nick

0

如果要多次通信客戶端和服務器,則必須進行兩次循環。

  1. 第一循環會詢問用戶選擇,啓動第二個循環,做任何你想要的基於服務器的響應和用戶選擇
  2. 第二循環會從服務器讀取

它可能看起來像所有線條即:

System.out.print("Enter your choice: "); 
while(true) { 
    fromClient = stdIn.readLine().trim(); 

    StringBuilder responseSb = new StringBuilder(); 
    while((fromServer = input.readLine()) != null) { 
     responseSb.append(fromServer); 
     responseSb.append("\n"); 
    } 

    String response = responseSb.toString().trim(); 

    System.out.println("Server: " + response); 
    if(response.equals("Bye")) { 
     break; 
    } 


    if(fromClient.equals("1")) 
    { 
     System.out.println("Client: " + fromClient); 
     output.println(fromClient); 

    } 
    if(fromClient.equals("2")) 
    { 
     System.out.println("Client: " + fromClient); 
     output.println(fromClient); 

    } 
    if(fromClient.equals("3")) 
    { 
     System.out.println("Client: " + fromClient); 
     output.println(fromClient); 

    } 
    if(fromClient.equals("4")) 
    { 
     System.out.println("Client: " + fromClient); 
     output.println(fromClient); 
     break; 

    } 


} 
+0

嘿邁克爾謝謝你的迴應。我試過使用你的代碼,當我運行它時,它會提示用戶選擇,並且在我鍵入它之後不會執行其他任何操作。 – Nick