处理套接字服务器上多个客户端间隔的最佳实践

Best practice for handling intervals for multiple clients on socket server

我正在学习 Socket.io 并致力于创建一个示例,其中多个客户端可以连接到我的广播时间的套接字服务器。但是,如果连接了一个客户端,并且连接了一个新客户端,它将停止读取第一个客户端的时间,直到他们刷新页面。我想知道是否有人能够解释为什么会发生这种情况以及实现我正在寻找的最佳做法是什么?

---编辑---

我相信这与我现在 setting/clearing 我的间歇期有关。

似乎当我的 clearInteral(interval) 方法被命中时,所有活动客户端的连接都会在新客户端启动之前停止。 但是,我仍然不完全确定解决此问题的最佳做法是什么。

服务器:

let interval;
io.on("connection", socket => {
    console.log(socket);
    console.log("New client connected");
    if (interval) {
        clearInterval(interval);
    }

    interval = setInterval(() => getApiAndEmit(socket), 1000);
    socket.on("disconnect", () => {
        console.log("Client disconnected");
    });
});

const getApiAndEmit = async socket => {
    try {
        const d = new Date();
        const formattedDate = `${d.getMonth()}/${d.getDay()}/${d.getFullYear()}`;
        const formattedTime = `${("0"+d.getHours()).slice(-2)}:${("0"+d.getMinutes()).slice(-2)}:${("0"+d.getSeconds()).slice(-2)}`;
        socket.emit("FromAPI", `${formattedDate} ${formattedTime}`);
    } catch (error) {
        console.error(`Error: ${error.code}`);
    }
};

客户:

const endpoint = "MY_ENDPOINT";
const socket = socketIOClient(endpoint);
socket.on("FromAPI", data => this.setState({ response: data }));

是的,对于每个新的客户端连接,它都会为该特定客户端生成 socket => {} 函数中的所有内容,因此对于其他客户端,对 clearInterval 的调用会清除之前的间隔,因此它不再触发的原因对于 other/previous 个客户。

解决方法是 运行 每个客户端的间隔,并在断开连接时清除它

io.on("connection", socket => {
    console.log("New client connected");
    
    let interval = setInterval(() => getApiAndEmit(socket), 1000);
    socket.on("disconnect", () => {
        clearInterval(interval);
        console.log("Client disconnected");
    });
});