ESP8266(NodeMCU)已连WiFi但无法连接Heroku部署的WebSocket服务
问题根因
你代码中设置的3000端口是Heroku应用实例内部的监听端口,不对公网暴露。Heroku公网边缘路由仅开放两个端口对外提供服务:80端口对应HTTP/未加密WS协议,443端口对应HTTPS/加密WSS协议。所有到达这两个端口的请求,才会被Heroku转发到应用实例内部的3000端口。
Postman能正常连通,是因为你填写连接地址时没有手动指定3000端口,客户端会自动使用协议默认端口发起请求,因此能正常触达服务;NodeMCU硬编码3000端口发起的请求,根本不会被Heroku路由接收,必然连接失败。
正确配置方案
根据你使用的连接协议选择对应端口即可:
- 若使用未加密的
ws://协议连接:端口填80,保持原有begin()方法调用即可 - 若使用加密的
wss://协议连接(Heroku平台推荐,连接稳定性更高):端口填443,需要将原有的begin()方法替换为beginSSL()发起加密连接
修正后的核心代码参考
const char* host = "<project_name>.herokuapp.com"; // 二选一即可,推荐用WSS加密方案 // const uint16_t port = 80; // WS协议对应端口 const uint16_t port = 443; // WSS协议对应端口 const char* url = "/"; // ... 其余初始化代码不变 // 若使用WS 80端口,用这行 // webSocketsClient.begin(host, port, url); // 若使用WSS 443端口,用下面两行,遇到证书校验错误可以加setInsecure跳过校验 webSocketsClient.setInsecure(); // 嵌入式调试场景可使用,跳过证书合法性校验 webSocketsClient.beginSSL(host, port, url); webSocketsClient.onEvent(webSocketCallback); webSocketsClient.setReconnectInterval(5000);
额外排查提示
如果改完端口还是连接失败,优先确认两点:
- NodeMCU连接的WiFi没有限制对外网80/443端口的访问
- Heroku应用端已经开启WebSocket支持,没有对请求来源做IP拦截
内容的提问来源于stack exchange,提问作者Ankit Kumar Maurya
相关产品推荐
相关产品推荐

