You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:18:28