如何在Java中使用相同的套接字连接执行多个HTTP请求?

亚历山大·派(Alexander Pie)

我有实验室工作来使用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();
尼古拉斯·菲洛托(Nicolas Filotto)

它们是您当前代码中的许多问题:

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

然后,请求为:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python套接字如何使用相同的套接字连接正确重定向http / s请求?

来自分类Dev

如何在Java中使用套接字打印/获取传入的HTTP POST请求的有效负载(带有套接字)

来自分类Dev

在C中使用套接字的HTTP请求

来自分类Dev

如何使用Java套接字HTTP / 1.1请求下载图像?

来自分类Dev

使用套接字的HTTP请求

来自分类Dev

通过套接字连接发送多个请求

来自分类Dev

如何在UWP中使用StreamSocket时知道套接字连接是否仍然有效?

来自分类Dev

如何在Python中使用管道时关闭套接字连接

来自分类Dev

执行使用Java套接字的多个单元测试

来自分类Dev

使用null检查Java从套接字读取HTTP请求

来自分类Dev

接收套接字请求,通过各个端点,并使用骆驼中的netty响应回相同的套接字连接

来自分类Dev

接收套接字请求,通过各个端点,并使用骆驼中的netty响应回相同的套接字连接

来自分类Dev

如何在java中保持连接套接字

来自分类Dev

如何快速打开多个套接字连接?

来自分类Dev

如何在Python ssl套接字缓冲中使用select?

来自分类Dev

如何在Python中使用套接字创建通道

来自分类Dev

如何在套接字中使用raw_input

来自分类Dev

如何在Python中使用套接字创建通道

来自分类Dev

如何在Python和子进程中使用套接字?

来自分类Dev

如何通过 Angular httpClient 中的一个套接字连接发出多个请求?

来自分类Dev

如何在Express 4路由中使用socket.io向连接的套接字发出事件?

来自分类Dev

如何在节点 js 中使用请求包禁用多个 http(s) 请求?

来自分类Dev

适用于Android的Firebase SDK正在使用套接字连接到Realtime Firebase,我可以使用自己的套接字在自己的Java应用中执行相同操作吗

来自分类Dev

如何在密码字符串中使用“§”来执行 http 请求?

来自分类Dev

套接字挂断错误与多个http.get请求

来自分类Dev

如何在Python中使用SSH连接从远程主机发送HTTP GET请求?

来自分类Dev

如何对共享相同地址 (URL) 的 URL 使用不同的 TCP 套接字连接

来自分类Dev

如何在一个 http 请求中使用节点呈现多个 mysql 查询

来自分类Dev

如何在http中使用多个进程

Related 相关文章

  1. 1

    python套接字如何使用相同的套接字连接正确重定向http / s请求?

  2. 2

    如何在Java中使用套接字打印/获取传入的HTTP POST请求的有效负载(带有套接字)

  3. 3

    在C中使用套接字的HTTP请求

  4. 4

    如何使用Java套接字HTTP / 1.1请求下载图像?

  5. 5

    使用套接字的HTTP请求

  6. 6

    通过套接字连接发送多个请求

  7. 7

    如何在UWP中使用StreamSocket时知道套接字连接是否仍然有效?

  8. 8

    如何在Python中使用管道时关闭套接字连接

  9. 9

    执行使用Java套接字的多个单元测试

  10. 10

    使用null检查Java从套接字读取HTTP请求

  11. 11

    接收套接字请求,通过各个端点,并使用骆驼中的netty响应回相同的套接字连接

  12. 12

    接收套接字请求,通过各个端点,并使用骆驼中的netty响应回相同的套接字连接

  13. 13

    如何在java中保持连接套接字

  14. 14

    如何快速打开多个套接字连接?

  15. 15

    如何在Python ssl套接字缓冲中使用select?

  16. 16

    如何在Python中使用套接字创建通道

  17. 17

    如何在套接字中使用raw_input

  18. 18

    如何在Python中使用套接字创建通道

  19. 19

    如何在Python和子进程中使用套接字?

  20. 20

    如何通过 Angular httpClient 中的一个套接字连接发出多个请求?

  21. 21

    如何在Express 4路由中使用socket.io向连接的套接字发出事件?

  22. 22

    如何在节点 js 中使用请求包禁用多个 http(s) 请求?

  23. 23

    适用于Android的Firebase SDK正在使用套接字连接到Realtime Firebase,我可以使用自己的套接字在自己的Java应用中执行相同操作吗

  24. 24

    如何在密码字符串中使用“§”来执行 http 请求?

  25. 25

    套接字挂断错误与多个http.get请求

  26. 26

    如何在Python中使用SSH连接从远程主机发送HTTP GET请求?

  27. 27

    如何对共享相同地址 (URL) 的 URL 使用不同的 TCP 套接字连接

  28. 28

    如何在一个 http 请求中使用节点呈现多个 mysql 查询

  29. 29

    如何在http中使用多个进程

热门标签

归档