Java - 套接字和循环

标签 java sockets http

我正在尝试使用 Java 向服务器连续发送一些 HTTP 请求。

Socket socket = new Socket("ip.address", port);
socket.setKeepAlive(true);  //it does not help
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));

for(int i=1;i<50;i++){

    String data = "some data " + i;
    wr.write("POST " + path + " HTTP/1.0\r\n");
    wr.write("Content-Length: " + data.length() + "\r\n");
    wr.write("Content-Type: application/x-www-form-urlencoded\r\n");
    wr.write("\r\n");
    wr.write(data);
    wr.flush();

}
wr.close();
socket.close();

服务器仅收到第一个请求,然后程序通过抛出异常而终止

java.net.SocketException: Software caused connection abort: socket write error

所以,我尝试了这种方式,每次都创建套接字并在循环内关闭:

for(int i=1;i<50;i++){
    Socket socket = new Socket("ip.address", port);
    BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));

    String data = "some data " + i;
    wr.write("POST " + path + " HTTP/1.0\r\n");
    wr.write("Content-Length: " + data.length() + "\r\n");
    wr.write("Content-Type: application/x-www-form-urlencoded\r\n");
    wr.write("\r\n");
    wr.write(data);
    wr.flush();

    wr.close();
    socket.close();
}

正如我所料,它工作得很好。服务器接收所有请求。

问题:

  1. 第二种方法正确吗?如果我每次都打开和关闭,一般不会影响性能吗?或者如何改进第一种方法?

  2. 还有其他更好的方法来发送 HTTP 请求吗? (它不必使用套接字)。性能对我们来说非常重要。

最佳答案

客户端和服务器必须就连接上期望的数据达成一致,即它们都必须遵守应用层协议(protocol),在本例中为 HTTP。

HTTP 1.1 does allow multiple requests per connection ,但是你的客户端和服务器必须正确协调。例如,如果服务器发送响应,客户端可能必须在发送下一个请求之前读取它等。

您似乎还在 header 中指定了 HTTP 1.0,该协议(protocol)没有明确定义对每个连接的多个请求的支持。

简而言之,在使用 HTTP 1.1 协议(protocol)的现代 Web 服务器上,只要客户端按照协议(protocol)定义一致地写入/读取数据,您就可以为每个请求发送多个请求。

此外,请注意 TCP(套接字)保活和 HTTP 保活之间的区别:TCP 保活管理连接本身,HTTP 保活定义跨连接的数据交换的语义。

Apache HttpComponents 是 Java 中 HTTP 客户端的一个好工具。图书馆。该库将处理所有 HTTP 详细信息,例如 header 、连接设置等。

关于Java - 套接字和循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33154065/

相关文章:

java - 所有节点的子节点数是否相等或者为 0

java - 如何在 JAVA 中将 CNF (a ∨ ¬b ∨ c) ∧ (¬a ∨ d) 表示为列表或字符串

java - ObjectMapper 无法解析为类型

c - 在套接字上使用 O_NONBLOCK 后,有没有办法避免 HUP?

c - 使用 C 套接字发送 HTTP 响应

java - 如何检测哪个组合框状态发生了变化?

Java(Kotlin) 套接字服务器。连续阅读

c# - 套接字异常 : ErrorCode vs. 套接字错误代码

performance - 所有网站图片上的 Mod_rewrite

spring - 发出 POST 请求时如何不转义 Spring RestTemplate 中的表单正文字符?