我正在尝试使用 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();
}
正如我所料,它工作得很好。服务器接收所有请求。
问题:
第二种方法正确吗?如果我每次都打开和关闭,一般不会影响性能吗?或者如何改进第一种方法?
还有其他更好的方法来发送 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/