Socket.io不断向每个客户端发出请求的数据

时间:2019-01-17 05:12:16

标签: node.js sockets websocket socket.io emit

这是代码:

客户

var server = "localhost";
var socket = io('http://' + serve + ':4005');
socket.on('connect',function(){ 
socket.emit('send', {type:"<?php echo $datatype?>"}); //{type:"3,2"}
  });

这是我的节点js服务器的代码:

服务器

io.on('connection', function(client) {

    console.log('Client connected...');

    client.on('join', function(data) {
        console.log(data);
    });
    client.on('send',function(data){
        var datafinal = [];

        setInterval(function () {
        var usertype = data.type;
        var types = usertype.split(',');
            for (var i = 0; i < types.length; i++){
                datafinal.push(apifinaldata.filter((inbound) => inbound.usertype == types[i] && inbound.active == 1 ));
                }
                var final = datafinal.reduce(function(a, b) {
                    return a.concat(b);
                }, []);

                datafinal = [];

            io.emit('finaldata', final); io.emit('callwaiting', callsdatafinal);
        }, 1000);
    })


});

server.listen(4005);

当我启动服务器时,它从客户端A接收到一个想要的数据类型的请求(例如{type : "3,2" }。因此服务器仅向客户端发出该特定数据。但是当另一个客户端说B询问时服务器发送{type : "1"}的数据,在这种情况下,服务器分别向客户端A和B发送正确的数据,但是客户端没有连续接收数据。服务器不断发送,但有时有时会向A发送有时是B。我希望服务器连续向每个连接的客户端发出请求的数据。

如果我更改io.emit('finaldata',final); io.emit('callwaiting',callsdatafinal);到client.emit('finaldata',final); client.emit('callwaiting',callsdatafinal);它不会向任何客户端发出任何数据。

所以我想要一个解决方案,使服务器仅向每个客户端连续发出每个客户端请求的特定数据

我该怎么做?

1 个答案:

答案 0 :(得分:1)

为此,您必须跟踪客户端A和B,然后仅将数据发送到特定客户端,下面是示例代码。

var clientA;
var clientB;
io.on('connection', function(client) {
    console.log('Client connected...');

    client.on('join', function(data) {
        if (something){
          clientA = client;
        }
        else {
          clientB = client;
        }
        console.log(data);
    });
    client.on('send',function(data){
        var datafinal = [];

        setInterval(function () {
        var usertype = data.type;
        var types = usertype.split(',');
            for (var i = 0; i < types.length; i++){
                datafinal.push(apifinaldata.filter((inbound) => inbound.usertype == types[i] && inbound.active == 1 ));
                }
                var final = datafinal.reduce(function(a, b) {
                    return a.concat(b);
                }, []);

                datafinal = [];

            if(someCondition){
              clientA.emit('finaldata', final);
              clientA.emit('callwaiting', callsdatafinal);
            }
            else {
              clientB.emit('finaldata', final);
              clientB.emit('callwaiting', callsdatafinal);
            }
        }, 1000);
    })
});

此处clientA和clientB是连接的两个客户端,您可以根据条件或程序逻辑将数据发送到任何客户端。