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

Pet*_*etr 10 sockets android

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

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);
        }
Run Code Online (Sandbox Code Playgroud)

out - outStream to browser

小智 7

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

和每个http请求像:

  • 请求行
  • 请求标题
  • 空行
  • 请求机构.

和每个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

in.readLine()返回不以'/ r/n'结尾的每一行,它以'/ r'或'/ n'返回行结束.也许从这里的输入流块中读取.

这是一个用'/ r/n'读取行结尾的IOStreamUtils.

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


Eya*_*ran 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...
}
Run Code Online (Sandbox Code Playgroud)