我有实验室工作来使用BSD套接字api制作搜寻器,因此我需要发出多个http请求以提取所有响应,我试图通过单个套接字连接来完成它,但是我只能在发送第一个请求标头后才能获得响应,其他响应为空。这是我的代码,那么解决方案是什么?
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();
它们是您当前代码中的许多问题:
host
在请求的标头中提供,以免出现错误404
。InputStream
直到获得-1
,这意味着您隐式地期望到达流的末尾(流关闭),这是您在尝试不断查询服务器时不想要的。Connection: keep-alive
以指示服务器,以避免在回答后关闭连接然后,请求为:
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);
注意:此代码并非是最佳或完美的代码,它仅显示了全球思路
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句