>我正在尝试在我的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.1rn" +
"Host: " + host + "rn" +
"Content-Type: application/json"+ "rn" +
"Content-Length: "+String(measureJson(doc)+2) + "rnrn" );
serializeJson(doc, JSONmessageBuffer);
httpsClient.print(JSONmessageBuffer);
httpsClient.print("rnConnection: keep-alivernrn");
但遗憾的是,我只能发送一次包裹,连接会自动关闭。你能指出我应该如何建立持久的HTTPS连接吗?
我认为问题是你有
httpsClient.print("rnConnection: keep-alivernrn");
在错误的地方。它应该包含在请求标头中 - 而不是在请求正文之后。在发送Connection: keep-alive
行时,您已经发送了Content-Length:
标头中指定的长度的数据。服务器将其视为新的HTTP请求 - 尽管格式不正确 - 因此关闭TCP连接。
您可以检查 HTTP 服务器日志以验证这一点。例如,如果您的服务器是 Apache,您可能会看到一行,其中包括
"连接:保持活动状态" 400
即,服务器已将您的Connection: keep-alive
行解释为单独的请求。400 表示Bad request
。
事实上。。。您可以完全删除Connection: keep-alive
- 因为默认情况下,连接在HTTP 1.1中是持久的。