Socket.io - io.to.emit向所有连接的用户发出

时间:2015-02-24 23:25:29

标签: javascript angularjs node.js sockets socket.io

我在客户端使用带快递和btford.socket-io的npm socket.io安装了MEAN应用程序。

angular.module('myApp',['btford.socket-io'])
    .factory('socket',function(socketFactory){
       return socketFactory();
    }
).controller('myAppCtrl',['$scope','socket',
    function(a,b){
            b.on('test',function(data){
            console.log(data);
        });
    } 
]);

这是node-express设置:

var app = express(),
    server = app.listen(3000);

var socket = require('socket.io'),
    io = socket.listen(server);

require('/config/routes/index.js')(app,io);
require('/config/routes/test.js')(app,io);

路由:(config / routes / index.js)

module.exports = function(app,io){
    app.get('/',function(req,res){
        io.on('connection',function(socket){
            socket.join(req.session._id);
        });
        res.render('index');
    });
};

配置/路由/ test.js

module.exports = function(app,io){
    app.get('/route1',function(req,res){
        io.to(req.session._id).emit('test',{
            data : 'Works'
        });
        res.render('route1');
    });  
};

A)每当用户转到route1时,就会触发emit事件并将其发送给所有用户。

B)是否有更好的方法可以避免为每个用户使用独特的空间?这不是聊天应用程序,而是实现推送通知

2 个答案:

答案 0 :(得分:0)

您需要将socket.io中的连接与请求分开考虑。他们 NOT 以您认为的方式捆绑在一起。您的连接侦听器用于任何连接,而不仅仅是与给定请求相关的连接......您尝试执行的操作不会以这种方式工作。

想象一下,项目的socket.io部分与应用程序的web / express部分中的http请求完全分开。这就是你应该如何看待传递消息。

另外值得考虑的是,如果您使用的是群集或类似的缩放方法,则在一个实例中的默认socket.io设置不会与其他实例通信。

答案 1 :(得分:0)

对于套接字和请求如何工作,您有几个主要的误解。它们是非常独立的操作,并且不像您认为的那样连接。我将尝试用您的代码解释问题。

在这段代码中:

module.exports = function(app,io){
    app.get('/',function(req,res){
        io.on('connection',function(socket){
            socket.join(req.session._id);
        });
        res.render('index');
    });
};

您正在处理/页面请求,并且每次请求被命中时,您都会为io.on('connection', ...)添加另一个事件处理程序,因此您可以拥有其中的许多事件处理程序。

此外,如果连接事件发生在用户点击/页面之前,那么您将完全错过它,并且该套接字不会被放入正确的聊天室。


然后,在这段代码中:

module.exports = function(app,io){
    app.get('/route1',function(req,res){
        io.to(req.session._id).emit('test',{
            data : 'Works'
        });
        res.render('route1');
    });  
};

io.to()采用一个字符串,即聊天室的名称。因此,这将向req.session._id聊天室中的每个套接字发送一条消息。为此,您必须确保req.session._id对此用户完全唯一,并且所需用户已通过此名称加入聊天室。这可能有效,但这取决于那些具体的事情是否正确。