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

使用Create-React-App集成Socket.io遭遇ERR_CONNECTION_REFUSED错误求助

解决Socket.io在create-react-app中出现ERR_CONNECTION_REFUSED的问题

嘿,我来帮你搞定这个连接拒绝的问题~你遇到的情况主要是跨域限制和一些小的代码细节问题,下面一步步来解决:

1. 配置服务端的跨域允许

因为你的客户端跑在localhost:3000,服务端在localhost:8000,浏览器的同源策略会阻止跨端口的Socket连接。你需要给Socket.io服务端添加CORS配置:

修改你的server.js代码:

// 改用Server构造函数,适配v4+版本的写法
const { Server } = require('socket.io');
const port = 8000;

// 初始化时配置CORS,明确允许3000端口的客户端请求
const io = new Server(port, {
  cors: {
    origin: "http://localhost:3000",
    methods: ["GET", "POST"]
  }
});

io.on('connection', (client) => {
  console.log('新客户端已成功连接'); // 新增这句方便确认连接状态
  client.on('subscribeToTimer', (interval) => {
    console.log('client is subscribing to timer with interval ', interval);
    setInterval(() => {
      client.emit('timer', new Date().toLocaleString()); // 格式化时间更易读
    }, interval);
  });
});

console.log('listening on port ', port);

2. 确保Socket.io客户端和服务端版本匹配

版本不兼容是连接失败的常见原因,如果你的服务端安装的是socket.io@4.x,客户端也要安装对应的socket.io-client@4.x版本:

先检查服务端版本:

npm list socket.io

客户端安装对应版本(以4.7.2为例):

npm install socket.io-client@4.7.2

3. 修复客户端组件的参数传递问题

你的组件里调用subscribeToTimer时只传了回调函数,但api.js里的函数需要两个参数(interval和cb),这会导致事件发送异常。修改组件的componentDidMount:

componentDidMount() {
  // 传入interval参数(比如1000)和回调函数
  subscribeToTimer(1000, (err, timestamp) => this.setState({ timestamp }));
}

或者给api.js里的函数设置默认值,让调用更灵活:

function subscribeToTimer(interval = 1000, cb) {
  socket.on('timer', timestamp => cb(null, timestamp));
  socket.emit('subscribeToTimer', interval);
}

4. 额外检查:确认服务端端口未被占用

虽然你说服务端定时器正常运行,还是可以确认下8000端口是否真的被Socket.io服务占用:

  • Windows:netstat -ano | findstr :8000
  • Mac/Linux:lsof -i :8000

如果有其他进程占用,要么杀死该进程,要么修改服务端的端口号。

按照上面的步骤修改后,重启服务端和客户端,应该就能正常建立Socket连接并获取时间戳啦~

内容的提问来源于stack exchange,提问作者DoomageAplentty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:06:07