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

如何借助Socket.IO服务器实现两个独立React项目的实时计数器同步?

实现两个独立React项目通过Socket.IO服务器跨项目同步计数器

需要实现两个独立的React项目,通过同一个Socket.IO服务器完成连接与通信,核心功能是:点击project-1中的counter1按钮时,project-2中的counter1数值无需刷新页面就能自动同步更新。

当前的目录结构如下:

parentDirectory:
    project-1:
        ReactProject1
    project-2:
        ReactProject2
    socketServer
        index.js (Socket.io服务端文件)

Socket.IO服务端代码(socketServer/index.js)

import { Server } from "socket.io";

// 启动Socket.IO服务器,监听3001端口
const io = new Server(3001, {
    cors: {
        origin: '*', // 允许所有来源的跨域请求
    }
});

// 监听客户端连接事件
io.on('connection', (socket) => {
    socket.emit('welcome', '连接已建立');
    // 监听客户端发送的msg事件
    socket.on('msg', (data) => {
        let dataArr = data.split("--")
        console.log(dataArr[0], dataArr[1])
        // 向客户端发送更新事件
        socket.emit('update1', data);
        socket.emit('update2', data);
    })
})

Project-1的App.js代码

import './App.css';

import React from 'react'
import CounterButton from './components/counter-button';
import { io } from 'socket.io-client';
// 连接到本地Socket.IO服务器
const socket = io("http://localhost:3001")

function App() {
  // 定义三个计数器的状态变量
  let [counter1, setCounter1] = React.useState(0);
  let [counter2, setCounter2] = React.useState(0);
  let [counter3, setCounter3] = React.useState(0);

  React.useEffect(() => {
    socket.on('connect', () => {
      // 监听服务器发送的update1事件,更新本地计数器
      socket.on('update1', (data) => {
        let dataArr = data.split('--')
        console.log("进入update1回调", data)
        let index = dataArr[0] - 0;
        let value = dataArr[1] - 0;
        if (index == 0) {
          setCounter1(value)
        }
        else if (index == 1) {
          setCounter2(value)
        }
        else if (index == 2) {
          setCounter3(value)
        }
      })
    })
  }, []);

  // 向服务器发送计数器更新消息
  const messageServer = (index, newValue) => {
    socket.emit('msg', "" + index + "--" + newValue);
  }

  return (
    <div className="App">
      <div className='button-row' style={{ "display": "flex", "flexDirection": "row", "gap": "20px" }}>
        <CounterButton buttonName={1}
          value={counter1}
          onClick={() => { messageServer(0, counter1 + 1) }}
        />
        <CounterButton buttonName={2}
          value={counter2}
          onClick={() => { messageServer(1, counter2 + 1) }}
        />
        <CounterButton buttonName={3}
          value={counter3}
          onClick={() => { messageServer(2, counter3 + 1) }}
        />
      </div>
    </div>
  );
}

export default App;

Project-2的App.js代码

Project-2的App.js代码与Project-1基本一致,仅在React.useEffect中监听的Socket.IO事件改为update2,具体代码片段如下:

React.useEffect(() => {
    socket.on('connect', () => {
      // 监听服务器发送的update2事件,更新本地计数器
      socket.on('update2', (data) => {
        let dataArr = data.split('--')
        console.log("进入update2回调", data)
        let index = dataArr[0] - 0;
        let value = dataArr[1] - 0;
        if (index == 0) {
          setCounter1(value)
        }
        else if (index == 1) {
          setCounter2(value)
        }
        else if (index == 2) {
          setCounter3(value)
        }
      })
    })
  }, []);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:10:41