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

Posted

技术标签:

【中文标题】Socket.io 不断向每个客户端发出请求的数据【英文标题】:Socket.io emit requested data to each client continuously 【发布时间】:2019-01-17 05:12:15 【问题描述】:

代码如下:

客户

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', calldatafinal);到 client.emit('finaldata', final); client.emit('callwaiting', calldatafinal);它不会向任何客户端发送任何数据。

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

我该怎么做?

【问题讨论】:

【参考方案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是连接的两个客户端,可以根据条件或者程序逻辑向任意客户端发送数据。

【讨论】:

以上是关于Socket.io 不断向每个客户端发出请求的数据的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 向房间里的每个人发出,除了发件人[重复]

python Flask-socket.io向特定客户端发出

socket.io vs RethinkDB changefeed

Node.js socket.io 没有响应 iOS socket.io 发出请求

websocket——通信梳理(短轮询、长轮询、socket、websocket、socket.io)

Laravel Homestead , Socket.io 连接被拒绝