【问题标题】:Best practice for handling intervals for multiple clients on socket server处理套接字服务器上多个客户端的间隔的最佳实践
【发布时间】:2021-06-22 06:14:09
【问题描述】:

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

---编辑---

我相信这与我现在如何设置/清除间隔有关。

似乎当我的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 }));

【问题讨论】:

    标签: reactjs express socket.io


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!这解决了我的问题并且效果很好!
    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 2021-02-11
    • 1970-01-01
    • 2020-11-11
    • 2012-05-24
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多