ESP8266 Socket服务器如何向多个客户端推送AIS/GPS数据?
解决ESP8266 Socket服务器多客户端数据推送问题
你的代码当前只能服务单个客户端,核心问题是loop()中通过server.available()获取单个客户端后,进入阻塞式的while(client.connected())循环,无法响应新的连接请求。要实现同时向2个客户端推送AIS/GPS数据,需要维护一个客户端连接列表,循环处理所有连接和数据推送。
修改后的完整代码
#include "ESP8266WiFi.h" const int port = 8888; WiFiServer server(port); const int maxClients = 2; // 设定最大支持2个客户端 WiFiClient clients[maxClients]; // 存储客户端连接的数组 String newHostname = "AISnode"; // 请在这里补充你的WiFi账号密码 const char* ConSSID = "你的WiFi名称"; const char* PassWord = "你的WiFi密码"; void setup() { Serial.begin(38400); // GetSSID(); // 假设这个函数是你用来获取WiFi信息的,需确保它能正确设置ConSSID和PassWord delay(2000); WiFi.hostname("NodeMCU"); WiFi.mode(WIFI_STA); WiFi.begin(ConSSID, PassWord); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println("\nWiFi已连接"); server.begin(); Serial.printf("服务器已启动,端口:%d\n", port); } void loop() { // 1. 处理新的客户端连接 WiFiClient newClient = server.available(); if (newClient) { // 遍历数组找空位,添加新客户端 for (int i = 0; i < maxClients; i++) { if (!clients[i]) { // 该位置无有效连接 clients[i] = newClient; Serial.printf("新客户端连接,当前连接数:%d\n", getConnectedClientsCount()); break; } } } // 2. 推送串口收到的AIS/GPS数据给所有在线客户端 if (Serial.available() > 0) { // 先读取完整的串口数据(避免分开发送) String data = Serial.readStringUntil('\n'); // 遍历所有客户端发送数据 for (int i = 0; i < maxClients; i++) { if (clients[i] && clients[i].connected()) { clients[i].println(data); // 确保数据发送完成 clients[i].flush(); } } } // 3. 清理断开的客户端连接 for (int i = 0; i < maxClients; i++) { if (clients[i] && !clients[i].connected()) { clients[i].stop(); Serial.printf("客户端断开连接,当前连接数:%d\n", getConnectedClientsCount()); } } delay(10); // 短暂延迟,避免占用过多CPU资源 } // 辅助函数:统计当前在线客户端数量 int getConnectedClientsCount() { int count = 0; for (int i = 0; i < maxClients; i++) { if (clients[i] && clients[i].connected()) { count++; } } return count; }
关键改动说明
- 维护客户端连接列表:用
WiFiClient数组存储最多2个客户端连接,避免阻塞单个连接的处理 - 非阻塞式处理:去掉原代码中阻塞的
while(client.connected())循环,改为在每次loop()中轮询处理新连接、数据推送和断开清理 - 批量数据推送:读取完整的串口数据后,遍历所有在线客户端统一发送,保证数据完整性
- 连接状态管理:定期检查客户端连接状态,清理无效连接,释放数组位置给新客户端
注意事项
- 请确保补充你的WiFi账号密码到
ConSSID和PassWord变量中 - 如果你的
GetSSID()函数负责自动获取WiFi信息,需保证它能正确赋值给ConSSID和PassWord - 若需要支持更多客户端,只需修改
maxClients的值即可
内容的提问来源于stack exchange,提问作者Aad Bloem
相关产品推荐
相关产品推荐

