我試圖在使用同一個套接字時向我的 esp32 服務器發送多個 http get 請求,但我的程式在列印出服務器的回應后停止。(這是我撰寫的一個小示例代碼,它應該打開和關閉連接到 esp 的 LED。)
這是客戶端代碼:
URL url;
String hostname;
Socket socket;
public HttpClient() throws UnknownHostException, IOException, InterruptedException {
url = new URL("http://192.168.178.56");
hostname = url.getHost();
int port = 80;
socket = new Socket(hostname, port);
PrintWriter output = new PrintWriter(socket.getOutputStream());
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
for(int i=1; i<50; i )
{
String x = i%2==0 ? "on" : "off";
System.out.println("h1");
output.write(
String.format(
"GET /" x " HTTP/2\r\n"
"Host: " hostname "\r\n"
"Connection: keep-alive\r\n"
"\r\n"
)
);
output.flush();
System.out.println("h2");
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
System.out.println("h3");
Thread.sleep(200);
}
}
這是控制臺輸出:
h1
h2
HTTP/1.1 200 OK
Content-Length: 2
Content-Type: text/plain
Connection: close
Accept-Ranges: none
可以看出它總是在 "System.out.println("h3");" 之前停止
我試圖遵循類似討論的答案,但沒有成功: How to do multiple http requests using the same socket connection in java?
我是否忽略了某些事情,還是應該采取完全不同的方法?
uj5u.com熱心網友回復:
"GET /" x " HTTP/2\r\n"
這甚至不是一個有效的 HTTP 請求。執行 HTTP/2 是一個比僅使用 HTTP/2 作為協議字串而不是 HTTP/1.1 或 HTTP/1.0 復雜得多的協議。
Connection: close
服務器明確表示將在回應后關閉連接。因此,在同一連接上將接受更多請求。
我正在嘗試在使用同一個套接字時向我的 esp32 服務器發送多個 http get 請求,
為了在同一連接上發送多個請求,服務器必須支持這一點。不能強迫服務器這樣做。即使支持持久連接(HTTP keep-alive),客戶端和服務器也可以在請求 回應完成后隨時關閉連接。
像在微控制器中使用的最小 HTTP 堆疊不會打擾實作持久連接并不少見,因為它更復雜且代碼更多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/529526.html
標籤:爪哇http插座客户
