gpt4 book ai didi

java - 如何在java中使用同一个套接字连接进行多个http请求?

转载 作者:行者123 更新时间:2023-12-01 09:55:53 25 4
gpt4 key购买 nike

我有实验室工作,使用BSD套接字API制作一个爬虫,所以我需要发出多个http请求来提取所有响应,我试图用单个套接字连接来做到这一点,但我只能在第一次发送后才能得到响应请求 header ,对于其他响应为空。这是我的代码,那么解决方案是什么?:

Socket socket = new Socket("fucking-great-advice.ru", 80);

BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter output = new PrintWriter(socket.getOutputStream());

for (int numberAdvice = 1; numberAdvice < 100; numberAdvice++) {
output.write("GET /advice/" + numberAdvice + " HTTP/1.0\r\n\r\n");
output.flush();

StringBuilder sb = new StringBuilder();
int ch = 0;
while ((ch = input.read()) != -1) {
sb.append((char) ch);
}
String response = sb.toString().split("\r\n\r\n")[1];
System.out.println(response);
}

input.close();
output.close();
socket.close();

最佳答案

您当前的代码中有很多问题:

  1. 您没有在请求 header 中提供主机,因此会收到错误404
  2. 您继续读取InputStream,直到获得-1,这意味着您隐式期望到达流的末尾(流关闭),这不是您想要的当您尝试继续查询服务器时。
  3. 您需要添加 header Connection: keep-alive以指示服务器避免在应答后关闭连接
  4. 由于该网站以 block 的形式提供结果,因此我们需要通过逐行读取响应并检查 block 的开头和结尾来在代码中对其进行管理。

请求是:

output.write(
String.format(
"GET /advice/%d HTTP/1.1\r\nHost: fucking-great-advice.ru\r\nConnection: keep-alive\r\n\r\n",
numberAdvice
)
);
output.flush();

以下是读取和显示响应的方法:

if (numberAdvice > 1) {
// Skip inter responses empty line
input.readLine();
}
StringBuilder sb = new StringBuilder();
String line;
boolean started = false;
while ((line = input.readLine()) != null) {
if (!started) {
// Here we check if we reached the end of the header
if (line.isEmpty()) {
// Here the body starts
started = true;
// Skip chunk start
input.readLine();
}
continue;
}
if ("0".equals(line)) {
// Reached chunk end
break;
}
sb.append(line);
}
System.out.println(sb);

注意:此代码并不意味着是最佳或完美的,它仅显示了全局思想

关于java - 如何在java中使用同一个套接字连接进行多个http请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37228549/

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