2016-06-08 82 views
0

我很抱歉,因爲我想不出任何更好的標題。 我已經用Java編寫的服務器 - 客戶端程序,服務器發送一個新的行字符\n客戶從socket.getInputStream()讀取結束一個字符串,如果輸入具有通過使用掃描儀Java - 使用掃描儀從套接字讀取InputStream

在服務器端的下一行

ServerSocket serverSocket = new ServerSocket(PORT); 
Socket socket = serverSocket.accept(); 
PrintWrite send = new PrintWriter(socket.getOutputStream); 
send.print("Server has succeeded to proccess your request \n" + show(ID)); 
send.flush(); 

show(ID)是一個函數,它返回一個已經包含下一行字符的字符串。 在客戶端

Socket socket = new Socket(HOST,PORT); 
Scanner read = new Scanner(socket.getInputStream); 
public Boolean ServerResponse(){ 
    System.out.println("please wait"); 
    Boolean result=false; 
    while(true){ 
     if(read.hasNextLine()){ 
      System.out.println("has next"); 
      String msg = read.nextLine(); 
      System.out.println(msg); 
      if(msg.contains("succeeded")){ 
       result = true; 
      } 

     }else{ 
      System.out.println("finished reading server respone"); 
      return result; 
     } 

    } 
} 

當我試圖運行這個。在由Server發送的最後一行發送之後,"finished reading server respone"從不被打印並且沒有has next,其假定沒有下一行字符。但是else塊永遠不會執行。奇怪的是,當我終止Server時,它被打印出來。任何人都可以向我解釋這一點,我必須做什麼,我不需要終止打印該行的服務器?

回答

0

Scanner#hasNextLine文件:如果在此掃描器的輸入另一行

返回true。 此方法可能會在等待輸入時阻塞。掃描儀不會通過任何輸入前進 。

意味着它將返回true如果下一行是可用的,這樣它會返回false當沒有下一行可用於處理。不過,它可能正在等待另一條線出現。

+0

因此,這意味着只有在有輸入但沒有下一行時才返回false。對於沒有輸入它會阻止?謝謝 – aukxn

1

您可能沒有關閉服務器端的PrintWriter。

由於SocketPrintWriter實現了自動關閉接口,您可以嘗試使用資源塊關閉資源時,服務器已完成與他們。

try (Socket socket = serverSocket.accept(); 
    PrintWriter send = new PrintWriter(socket.getOutputStream);) { 
    send.print("Server has succeeded to proccess your request \n" + show(ID)); 
} 

當你調用客戶端的方法hasNextLine在您的掃描儀,它會阻止等待輸入。

如果關閉服務器,則流將關閉,並且方法hasNextLine返回false,並且finished reading server response將顯示在客戶端中。

+0

這意味着在每次服務器發送內容之後,它必須關閉PrintWriter,下一次它必須創建新的PrintWriter。關閉PrintWriter以關閉OuputStream? – aukxn

+0

您的客戶端正在被'hasNextLine'方法阻塞,等待來自服務器的輸入。如果服務器不再發送任何東西並關閉流,客戶端將打印「完成讀取服務器響應」。如果你的服務器要發送更多的數據,你不應該關閉流,我猜你的客戶端可以等待更多的輸入。 –