如何通过套接字读取HTTP响应?

时间:2017-02-11 19:19:39

标签: android sockets

我正在尝试在Android设备上创建http代理服务器。当我尝试从HTTP服务器(example1.com)读取响应时(example1.com包含标题中的内容长度) 如果HTTP服务器包含content-length,那么我从content-length读取字节 否则我会读取所有响应字节

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

问题在于,当响应包含content-length响应时 读得很快。 如果回复不包含content-length,则回复缓慢。

这是我的代码

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 to browser

2 个答案:

答案 0 :(得分:7)

请尝试以下代码:

// 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...
}

答案 1 :(得分:6)

首先,你应该知道http protocal是什么以及它是如何工作的。

和每个http请求一样:

  • 请求行
  • 请求标题
  • 空行
  • Request Body。

和每个http响应如:

  • 状态行
  • 响应标题
  • 空行
  • 响应机构。

但是我们可以从http服务器读取InputStream,我们可以将从inputstream端读取的每一行拆分为' / r / 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()返回每一行不以' / r / n'结尾,它以' / r'返回行尾。或者' / n' 。 也许从这里的输入流块中读取

这是一个IOStreamUtils,用' / r / n'来读取行尾。

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