gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:01:07 24 4
gpt4 key购买 nike

我正在尝试在 Android 设备上创建 http 代理服务器。当我尝试从 HTTP 服务器 (example1.com) 读取响应时(example1.com 在 header 中包含内容长度)如果 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);
}

out - outStream 到浏览器

最佳答案

首先,您应该了解什么是 http 协议(protocol)及其工作原理。

每个 http 请求都像:

  • 请求行
  • 请求头
  • 空白行
  • 请求正文。

每个 http 响应都像:

  • 状态行
  • 响应头
  • 空白行
  • 响应正文。

但是我们可以从 http 服务器读取 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' 结尾的行。 可能从此处的输入流 block 中读取

这是一个 IOStreamUtils,用于读取以“/r/n”结尾的行。

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

关于android - 如何通过套接字读取 HTTP 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com