2011-03-03 91 views
2

客戶端:HTTPServlet的Request.getInputStream()總是接收空行

public List<String> post(List<String> toWrite){ 
     String result = ""; 
     List<String> allResults = new ArrayList<String>(); 

     try { 
      openConnection(); 
      connection.setDoOutput(true); 
      connection.setRequestMethod("POST"); 
      initializeOutputStream(); 
      for(int i = 0; i < toWrite.size(); i++){ 
       out.write(toWrite.get(i)); 
       out.newLine(); 
      } 
      System.out.println(connection.getResponseCode()); 
      System.out.println(connection.getResponseMessage()); 
      initializeInputStream(); 
      while((result = in.readLine()) != null){ 
       allResults.add(result); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      closeConnection(); 
     } 

     return allResults; 
    } 

One of the attempts at the host: 

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     List<String> incoming = new ArrayList<String>(); 

//  BufferedReader in = req.getReader(); 
// 
//  String tmp = in.readLine(); 

     resp.setContentType("text/plain"); 
     PrintWriter out = resp.getWriter(); 

     StringBuilder stringBuilder = new StringBuilder(); 
     BufferedReader bufferedReader = null; 
     try { 
      InputStream inputStream = req.getInputStream(); 
      if (inputStream != null) { 
      bufferedReader = new BufferedReader(new InputStreamReader( 
     inputStream)); 
      char[] charBuffer = new char[128]; 
      int bytesRead = -1; 
      //while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { 
      while(bytesRead != -1){ 
      stringBuilder.append(charBuffer, 0, bytesRead); 
      } 
      } else { 
      stringBuilder.append(""); 
      } 
     } catch (IOException ex) { 
      throw ex; 
     } finally { 
      if (bufferedReader != null) { 
      try { 
      bufferedReader.close(); 
      } catch (IOException ex) { 
      throw ex; 
      } 
      } 
     } 
     String body = stringBuilder.toString(); 
     System.out.println(body); 

     out.println(body); 

//  BufferedReader in = new BufferedReader(new InputStreamReader(req.getInputStream()));   
//  
//  String tmp = ""; 
//  
//  //while(!(in.ready())){} 
//  
//  while((tmp = in.readLine()) != null){ 
//   System.out.println(tmp); 
//  } 
// 
// 
//  out.println(tmp); 

     out.println("end"); 

    } 

請注意,註釋掉我試圖從客戶端得到的東西很多其他的嘗試線 - 這就是一個。

servlett的System.out.printlns和out.printlns都返回一個空行。程序結束時的「結束」返回沒有問題。這不是在客戶端讀取多行的問題 - 如果我放置多個out.println,那麼我就可以讀取它們。輸入流的system.out.println()也返回空白。狀態碼是200,所以似乎沒有連接錯誤。

有人嗎?

回答

5

看起來你的while循環在這裏沒有做任何事情,因爲在你的情況下,bytesRead總是-1,因此它永遠不會進入循環,此外,根本不使用bufferedReader從輸入流中讀取: -

int bytesRead = -1; 
    while (bytesRead != -1) { 
     stringBuilder.append(charBuffer, 0, bytesRead); 
    } 

嘗試這種情況: -

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    resp.setContentType("text/plain"); 
    PrintWriter out = resp.getWriter(); 

    StringBuilder stringBuilder = new StringBuilder(1000); 
    Scanner scanner = new Scanner(req.getInputStream()); 
    while (scanner.hasNextLine()) { 
     stringBuilder.append(scanner.nextLine()); 
    } 

    String body = stringBuilder.toString(); 

    System.out.println(body); 
    out.println(body); 

} 
0

替換下面線

while(bytesRead != -1){ 
     stringBuilder.append(charBuffer, 0, bytesRead); 
} 

bufferedReader.read(charBuffer); 
String str = new String(charBuffer); 
System.out.println(charBuffer); 

希望工程。