Node.js websocket发送到特定用户节点

Node.js websocket发送到特定用户节点,node.js,websocket,Node.js,Websocket,我目前正在为移动前端创建websocket服务器。在某些情况下,我只需要向特定用户发送一个json,经过几次尝试后,我仍然无法让Websocket正常工作,因此我可以一次向一个客户端发送json 我正在使用这个库:github.com/websockets/ws 为了解释我的问题,我有几个产品,其中包含几个需要实时刷新的变量。当用户连接到某个产品时,他将只收到该产品的json,而其他用户将收到他们当前使用的其他产品的json。这就是为什么我想向用户发送一个特定的json来启用它 我想知道你们中是

我目前正在为移动前端创建websocket服务器。在某些情况下,我只需要向特定用户发送一个json,经过几次尝试后,我仍然无法让Websocket正常工作,因此我可以一次向一个客户端发送json

我正在使用这个库:github.com/websockets/ws

为了解释我的问题,我有几个产品,其中包含几个需要实时刷新的变量。当用户连接到某个产品时,他将只收到该产品的json,而其他用户将收到他们当前使用的其他产品的json。这就是为什么我想向用户发送一个特定的json来启用它

我想知道你们中是否有人知道如何解决这个问题,因为我开始阻止它

多谢各位

const opp = new WebSocket.Server({port: 10001});
let user = 0;
let lookup = [];

opp.on('connection', function connection(op) {
    lookup.push(op.id);
    let id = "";
    op.on('message', function incoming(message) {
        console.log('received: %s', message);
        id = message;
        query = {
            text: "SELECT id,state,users_list_name,user_win,timer_stamp FROM products WHERE id = " + parseInt(id) + " AND circle = 1 ORDER BY CASE WHEN state = \'available\' THEN \'1\' WHEN state = \'soon\' THEN \'2\' WHEN state = \'expired\' THEN \'3\' END",
        };
    });
    client.connect();
    const interval = setInterval(function ping() {
        client.query(query, (err, res) => {
            if (err) {
                console.log(err.toString());
                console.log(query);
            } else {
                console.log(lookup);
               for (let i = 0; i < lookup.length; i++){
                    console.log("########################");
                    lookup[i].send(JSON.stringify(res.rows));
                }
            }
        });
    }, 300);
});``` 

嗯。仍在努力理解你拍摄的实际规格。但是,根据您对我先前问题的回答,假设如下:

客户端使用webSocket进行连接。 当他们通过webSocket发送消息时,该消息是可以在您的数据库中查找的内容的id,他们希望定期更新。 该特定id的更新应该只发送给请求它的特定客户端。 如果不同的客户端连接并指定了某个id,则它们应该只获取该id的更新。 当客户端发送指定不同id的新消息时,它们的更新现在应该只针对该新id。 一个客户端请求的id的更新仅发送给该客户端,而不发送给其他客户端。 如果这是你真正想要的,这里有一个方法来构建它

const wss = new WebSocket.Server({port: 10001});

// make database connection that all users share
client.connect();

wss.on('connection', function connection(ws) {
    // these variables are unique to each ws connection
    let interval, query;

    // when webSocket closes, stop any current interval timer associated with this webSocket
    ws.on('close', function() {
        if (interval) {
            clearInterval(interval);
        }
    });

    // when we get an id, start querying for updates on that id
    ws.on('message', function incoming(id) {
        console.log(`received: ${id}`);
        query = {
            text: "SELECT id,state,users_list_name,user_win,timer_stamp FROM products WHERE id = " + parseInt(id) + " AND circle = 1 ORDER BY CASE WHEN state = \'available\' THEN \'1\' WHEN state = \'soon\' THEN \'2\' WHEN state = \'expired\' THEN \'3\' END",
        };
        // if interval is not already going, start it
        if (!interval) {
            interval = setInterval(function() {
                client.query(query, (err, res) => {
                    if (err) {
                        console.log(err);
                        console.log(query);
                    } else {
                        // send data to just the one client that this timer is for
                        ws.send(JSON.stringify(res.rows));
                    }
                });
            }, 300);
        }
    });
});
现在,有一些评论:

在短时间间隔内为每个客户机使用单独的轮询循环轮询数据库根本无法扩展。您将遇到严重的数据库规模问题。您确实需要更好的设计,但由于我们不知道您的应用程序的总体需求和体系结构,因此我们没有足够的信息来知道建议什么。您可能希望利用数据库中的通知来告诉您数据何时发生更改,而不是代表每个客户机在短时间内轮询数据

我找不到查找数据结构的原因。您的评论说您希望将更新发送到一个特定的客户端,即请求该id的客户端。这可以通过ws.send完成

此代码假定客户机变量表示到数据库的连接,每个连接的客户机的每个setInterval都可以共享该连接。这就是为什么该代码被移出wss。在“连接”上。。。事件处理程序

我转而使用更常见的wss术语来指代服务器实例,而ws则指代特定连接客户机的webSocket

ws.send是您发送到连接的客户端的方式。我还是不知道你在用op.id做什么。查看ws-library的文档,这似乎不是您可以用来发送到的内容

您的代码和这段代码为每个连接的webSocket客户端创建了一个单独的setInterval计时器,它使用非常短的间隔时间。这将无法扩展。在最坏的情况下,间隔时间需要延长到几秒,具体取决于所需的目标比例。充其量,您需要完全停止轮询数据库,并使用数据库中的其他机制在数据更改时获取通知


为什么标题是socket.io,而代码使用的是普通的webSocket?是哪一个?这是个错误,谢谢你指出。所以,lookup[i]将是op.id中的一个id。这真的是你可以发送的吗?您正在使用哪个websocket服务器模块,以便我可以查看它的API?另外,问题的第一句话仍然提到socket.io。我看到您已经更正了标题。如果您只想将数据发送到启动此间隔的客户端,则不必遍历所有查找数组,只需执行op.send即可。这将表示向您发送消息以设置与此间隔对应的查询的客户端。仅供参考,对于每个连接的webSocket,以300ms的频率运行单独的setInterval根本无法扩展。你会发现数据库将很快成为一个瓶颈。我不知道您试图解决的是什么问题,但您需要一个不同/更好的体系结构,它不会让每个客户端每300ms单独访问您的数据库。这正是我想要做的,感谢您在这方面花费的时间。我是nodejs的新手,所以我的回答可能不是最准确的,对此表示抱歉。谢谢