Javascript 向给定通道中的所有用户发送数据-Nodejs(Socket.io)

Javascript 向给定通道中的所有用户发送数据-Nodejs(Socket.io),javascript,node.js,sockets,Javascript,Node.js,Sockets,我有一个非常简单的场景。其中所有用户都是订阅者,API数据调用是发布者。我将相同的数据发送给所有连接到X通道的用户 我知道socket.io中有三个可用的函数 socket.emit('example', data); io.sockets.emit('example', data); socket.broadcast.emit('example', data); 在我的示例中,我使用套接字在客户端推送实时数据。我面临的问题是,如果超过1个用户加入特定通道,那么数据将被发送到所有N次 我每N秒

我有一个非常简单的场景。其中所有用户都是订阅者,API数据调用是发布者。我将相同的数据发送给所有连接到X通道的用户

我知道socket.io中有三个可用的函数

socket.emit('example', data);
io.sockets.emit('example', data);
socket.broadcast.emit('example', data);
在我的示例中,我使用套接字在客户端推送实时数据。我面临的问题是,如果超过1个用户加入特定通道,那么数据将被发送到所有N次

我每N秒发送一次数据。如果加入了一个用户,那么一切都很好。因为x数据发送给连接的单个用户。但如果两个用户连接到同一个通道,如果我每10秒发送x个数据,我会看到发送速度减半,即每5秒发送一次数据。如果我打开10个选项卡(表示连接了10个用户),并且每10秒向所有连接的用户发送一次数据。我看到数据每1秒发送给所有用户

因为我的应用程序将实时数据从API推送到所有用户,而不是向所有其他连接的用户发送一个用户的消息。我想我需要不同的方法。也就是说,我不希望任何用户监听任何其他用户,而只是接收每个人正在接收的相同数据

我如何做到这一点

下面是我的代码 服务器端代码

var app = require('express')();
var http = require('http').Server(app);
var httpk = require('http');
var io = require('socket.io')(http);
var nsp = io.of('/channel1');

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

nsp.on('connection', function(socket){

  nsp.emit('live', 'Welcome User!');

  function test()
  {
    httpk.get("api-to-url", function(res) {
        var body = ''; 
        res.on('data', function(data){
            body += data;
        });
        res.on('end', function() {
            var parsed = JSON.parse(body);
            console.log(parsed.johndoe.bid_price);
            nsp.emit('live', parsed.johndoe.bid_price);
        });
    });
  }

  setInterval(test,10000);

  socket.on('disconnect', function(){
    console.log('1 user disconnected');
  });

});

http.listen(3000, function(){
  console.log('listening on *:3000');
});
<!doctype html>
<html>
  <head>
    <title>Live App</title>
    <style>
      body { font: 26px Helvetica, Arial; font-weight:bold;}

      #livez { text-align: center;}
    </style>
  </head>
  <body>
    <p id="livez"></p>


    <script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>

<script>
  $(function () {
    var socket = io('/channel1');

     socket.on('live', function(msg){
    $('#livez').text(msg);
    });
  });

</script>
  </body>
</html>
客户端代码

var app = require('express')();
var http = require('http').Server(app);
var httpk = require('http');
var io = require('socket.io')(http);
var nsp = io.of('/channel1');

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

nsp.on('connection', function(socket){

  nsp.emit('live', 'Welcome User!');

  function test()
  {
    httpk.get("api-to-url", function(res) {
        var body = ''; 
        res.on('data', function(data){
            body += data;
        });
        res.on('end', function() {
            var parsed = JSON.parse(body);
            console.log(parsed.johndoe.bid_price);
            nsp.emit('live', parsed.johndoe.bid_price);
        });
    });
  }

  setInterval(test,10000);

  socket.on('disconnect', function(){
    console.log('1 user disconnected');
  });

});

http.listen(3000, function(){
  console.log('listening on *:3000');
});
<!doctype html>
<html>
  <head>
    <title>Live App</title>
    <style>
      body { font: 26px Helvetica, Arial; font-weight:bold;}

      #livez { text-align: center;}
    </style>
  </head>
  <body>
    <p id="livez"></p>


    <script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>

<script>
  $(function () {
    var socket = io('/channel1');

     socket.on('live', function(msg){
    $('#livez').text(msg);
    });
  });

</script>
  </body>
</html>

实时应用程序
正文{字体:26px Helvetica,Arial;字体重量:粗体;}
#livez{text align:center;}

$(函数(){ var socket=io('/channel1'); socket.on('live',函数(msg){ $('#livez').text(msg); }); });
来自此:

  nsp.on('connection', function(socket){

  nsp.emit('live', 'Welcome User!');

  function test()
  {
    httpk.get("api-to-url", function(res) {
        var body = ''; 
        res.on('data', function(data){
            body += data;
        });
        res.on('end', function() {
            var parsed = JSON.parse(body);
            console.log(parsed.johndoe.bid_price);
            nsp.emit('live', parsed.johndoe.bid_price);
        });
    });
  }

  setInterval(test,10000);

  socket.on('disconnect', function(){
    console.log('1 user disconnected');
  });

});

http.listen(3000, function(){
  console.log('listening on *:3000');
});
为此:

 function test()
  {
    httpk.get("api-to-url", function(res) {
        var body = ''; 
        res.on('data', function(data){
            body += data;
        });
        res.on('end', function() {
            var parsed = JSON.parse(body);
            console.log(parsed.johndoe.bid_price);
            nsp.emit('live', parsed.johndoe.bid_price);
        });
    });
  }



 setInterval(test,10000);

nsp.on('connection', function(socket){

  nsp.emit('live', 'Welcome User!');

  socket.on('disconnect', function(){
    console.log('1 user disconnected');
  });

});

由于您的
setInterval
在每个客户端连接中都是本地设置的,因此您将重复该设置,从而导致多次调用该间隔。您需要将其设置为在外部配置,以便对登录到页面的客户端不可知。

当前功能源于“on connection”回调中存在的setInterval。在每个连接上,您现在都告诉该实例从初始实例化开始每隔10秒执行一次函数测试。@AaronF我明白您的意思了。在每个新连接上,我都执行http请求。因此,10个用户意味着X秒内有10个http请求。那么我如何发出http请求呢?并且只发送一次?您需要在连接的客户端的内部范围之外创建setinterval。正确。如果你想把它移出连接块,你想在每个emit上发送什么样的信息?@AaronF它的股票价格。我把它放出来了,它解决了这个问题。