2017-02-11 33 views
9

Tôi đang cố gắng tạo máy chủ proxy http trên thiết bị Android. Khi tôi thử phản hồi đọc từ máy chủ HTTP (example1.com) (example1.com chứa nội dung có độ dài tiêu đề) Nếu máy chủ HTTP chứa nội dung độ dài, sau đó tôi đọc byte từ độ dài nội dung khác tôi đọc tất cả byte của phản ứngCách đọc phản hồi HTTP qua ổ cắm?

byte[] bytes = IOUtils.toByteArray(inFromServer);

vấn đề là, khi phản ứng chứa content-length phản ứng đọc một cách nhanh chóng. Nếu phản hồi không chứa content-length phản hồi đọc chậm.

này mã của tôi

DataInputStream in = new DataInputStream(inFromServer); 
     //BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String line = ""; 
     String str = ""; 
     Integer len = 0; 
     while(true) { 
      line = in.readLine(); 
      if (line.indexOf("Content-Length") != -1) 
      { 
       len = Integer.parseInt(line.split("\\D+")[1]); 
       //System.out.println("LINEE="+len); 
      } 

      out.println(line); 
      str = str + line + '\n'; 
      if(line.isEmpty()) break; 
     } 
     int i = Integer.valueOf(len); 
     String body= ""; 
     System.out.println("i="+i); 
     if (i>0) { 
      byte[] buf = new byte[i]; 
      in.readFully(buf); 
      out.write(buf); 
      for (byte b:buf) { 
       body = body + (char)b; 
      } 

     }else{ 

      byte[] bytes = IOUtils.toByteArray(inFromServer); 
      out.write(bytes); 
     } 

out - outStream để duyệt

+0

Tại sao bạn không sử dụng một thư viện HTTP tầm cao mới? –

+0

Tôi đang nghiên cứu giao thức http – Petr

+0

Được rồi, và vấn đề của bạn là có 0 nội dung để đọc khi không có tiêu đề, vì vậy nó sẽ chậm hơn vì nó đọc toàn bộ phản hồi? –

Trả lời

6

Trước hết, bạn nên biết những gì http giao thức và làm thế nào nó hoạt động.

và mỗi http Yêu cầu như:

  • Request Dòng
  • Tiêu đề yêu cầu
  • Dòng Trống
  • Request Body.

và mỗi ứng http như:

  • Dòng Status
  • đáp ứng Tiêu đề
  • Dòng Trống
  • đáp ứng cơ thể.

Tuy nhiên chúng tôi có thể đọc InputStream từ máy chủ http, chúng tôi có thể chia từng dòng chúng tôi đọc từ đầu vào cuối bằng '/ r/n'.

và mã của bạn:

while(true) { 
    **line = in.readLine();** 
    if (line.indexOf("Content-Length") != -1) 
    { 
     len = Integer.parseInt(line.split("\\D+")[1]); 
      //System.out.println("LINEE="+len); 
     } 

     out.println(line); 
     str = str + line + '\n'; 
     if(line.isEmpty()) break; 
    } 
} 

in.readLine() trả lại tất cả các dòng không kết thúc với '/ r/n', nó trả lại dòng kết thúc với '/ r' hoặc '/ n '. Có thể đọc từ khối đầu vào ở đây.

Dưới đây là IOStreamUtils để đọc dòng kết thúc bằng '/ r/n'.

https://github.com/mayubao/KuaiChuan/blob/master/app/src/main/java/io/github/mayubao/kuaichuan/micro_server/IOStreamUtils.java

7

Hãy thử đoạn mã sau:

// Get server response 
int responseCode = connection.getResponseCode(); 
if (responseCode == 200) { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
    String line; 
    StringBuilder builder = new StringBuilder(); 
    while ((line = reader.readLine()) != null) { 
     builder.append(line); 
    } 
    String response = builder.toString() 
    // Handle response... 
} 
+0

Ngoài đoạn mã trên: Mã nên xử lý ngoại lệ. Trong trường hợp tối đa nếu mã phản hồi là 200, luồng phản hồi có thể là null. –

Các vấn đề liên quan