gpt4 book ai didi

c++ - nodeMCU 上的持久 https 连接

转载 作者:行者123 更新时间:2023-11-30 03:16:01 27 4
gpt4 key购买 nike

我正在尝试在我的 nodeMCU 和远程服务器之间建立持久连接,因为我将使用它每 2 秒向远程服务器发布一次。重新连接的成本大约是 400 毫秒,这对我来说太多了。

我曾经在设置函数中运行连接片段

 int r=0; 
while((!httpsClient.connect(host, httpsPort)) && (r < 30))
{
delay(100);
Serial.print(".");
r++;
}
Serial.println("");
if(r==30) {
Serial.println("Connection failed");
}
else {
Serial.println("Connected to web");
}

然后在 while 循环中,我每 2 秒左右运行一次 https post 方法。

httpsClient.print(String("POST ") + "/post HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Content-Type: application/json"+ "\r\n" +
"Content-Length: "+String(measureJson(doc)+2) + "\r\n\r\n" );
serializeJson(doc, JSONmessageBuffer);
httpsClient.print(JSONmessageBuffer);
httpsClient.print("\r\nConnection: keep-alive\r\n\r\n");

但遗憾的是,我只能发送一次包裹,连接会自动关闭。您能指出应该如何建立持久 HTTPS 连接的方向吗?

最佳答案

我认为问题是你有

httpsClient.print("\r\nConnection: keep-alive\r\n\r\n");

放错地方了。它应该包含在请求 header 中——而不是在请求正文之后。当您发送 Connection: keep-alive 行时,您已经发送了 Content-Length: header 中指定长度的数据。服务器将其视为新的 HTTP 请求 - 尽管格式不正确 - 因此关闭 TCP 连接。

您可以检查 HTTP 服务器日志来验证这一点。例如,如果您的服务器是 Apache,您可能会看到一行包含

"Connection: Keep-alive" 400

即,服务器已将您的 Connection: keep-alive 行解释为单独的请求。 400 表示 错误请求

事实上...您可以完全删除 Connection: keep-alive - 因为在 HTTP 1.1 中默认情况下连接是持久的。

关于c++ - nodeMCU 上的持久 https 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56623168/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com