ESP32如何分多步回复HTTP请求?(WebServer_WT32_ETH01库)
解决思路与实现方案
要实现ESP32分批次发送HTTP响应(类似PHP的ob_flush实时输出),核心是利用HTTP的分块传输编码(Chunked Transfer Encoding),绕过WebServer库默认的一次性send方法,直接操作底层套接字逐步发送内容。
具体步骤:
- 手动发送分块传输响应头:直接向客户端套接字发送HTTP响应行和头,指定
Transfer-Encoding: chunked,告知客户端响应将分块传输,保持连接不关闭。 - 分批次发送传感器数据块:每次读取传感器后,按分块格式发送数据——先写十六进制的内容长度,再写
\r\n,接着写内容,最后补\r\n,确保客户端能正确解析每一块。 - 发送结束块并关闭连接:所有数据发送完成后,发送长度为0的结束块(
0\r\n\r\n),再关闭套接字。
修改后的示例代码:
#include <WebServer_WT32_ETH01.h> WebServer server(80); // 模拟传感器读取函数,替换为你的实际传感器逻辑 int read_sensor() { delay(random(1000, 5000)); // 模拟0-20秒的等待,此处简化为1-5秒 return random(0, 100); } void request_root() { EthernetClient client = server.client(); // 发送HTTP响应头,启用分块传输 client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/plain"); client.println("Transfer-Encoding: chunked"); client.println("Connection: keep-alive"); client.println(); // 响应头与内容的分隔空行 // 发送初始提示信息 String initialMsg = "20 sensor readings:\n"; client.printf("%x\r\n", initialMsg.length()); // 发送块长度(十六进制格式) client.print(initialMsg); client.print("\r\n"); client.flush(); // 强制输出缓冲区内容,确保实时显示 // 循环发送传感器数据 for (int i = 0; i < 20; i++) { if (!client.connected()) break; // 检测客户端是否断开连接,避免无效发送 int v = read_sensor(); String dataLine = String("time=") + millis()/1000 + " value=" + v + "\n"; // 按分块格式发送当前数据 client.printf("%x\r\n", dataLine.length()); client.print(dataLine); client.print("\r\n"); client.flush(); } // 发送结束块,关闭连接 client.println("0\r\n\r\n"); client.stop(); } void setup() { // 初始化以太网(根据你的硬件配置补充相关初始化代码) ETH.begin(); server.on("/", request_root); server.begin(); } void loop() { server.handleClient(); }
关键注意事项:
- 必须调用
client.flush(),否则数据可能滞留在缓冲区无法实时发送。 - 要检测
client.connected(),避免客户端断开后继续发送浪费资源。 - 分块长度必须使用十六进制字符串,不能用十进制。
- 绝对不能调用
server.send(),否则会覆盖手动发送的响应头并直接关闭连接。
内容的提问来源于stack exchange,提问作者pzn
相关产品推荐
相关产品推荐

