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

Socket.io - io.to.emit emits to all connected users

本文关键字:连接 用户 发射 io-io to emit Socket      更新时间:2024-05-10

我在客户端上用npm socket.io和expressjs和btford.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);
        });
    } 
]);

这是节点快速设置:

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');
    });
};

config/routes/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) 有没有更好的方法来避免为每个用户使用唯一的房间?这不是一个聊天应用程序,而是实现推送通知

您对套接字和请求的工作方式有几个主要误解。它们是非常独立的操作,并不像你想象的那样联系在一起。我会尽力解释你的代码存在的问题。

在这个代码块中:

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对该用户来说是完全唯一的,并且所需用户已经以该名称加入了聊天室。这是可行的,但这取决于那些具体的事情是否正确。

您需要将socket.io的连接与请求分开考虑。它们不是像你认为的那样紧密相连。您的连接侦听器适用于任何连接,而不仅仅是与给定请求相关的连接。。。你想做的事情根本不会那样奏效。

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

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