Socket.io-io.to.emit向所有连接的用户发射
Socket.io - io.to.emit emits to all connected users
我在客户端上用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设置不会与其他实例通信。
- SignalR客户端启动连接时如何设置用户
- 我们如何在互联网断开连接或用户关闭选项卡/浏览器时调用注销servlet
- 公共任务连接()在用户连接到中心类时未触发
- Zkoss:如何通知用户会话超时或与服务器的连接丢失
- 在连接期间隐藏用户,不使用 goinstant
- Socket.io-io.to.emit向所有连接的用户发射
- nodeJS视频流,当用户断开连接或移动到不同页面时,连接不会关闭
- Node.js:在用户连接之前向客户端发送数据
- Facebook已连接但我的用户是一个空对象
- SignalR异常“;无法识别的用户标识.在活动SignalR连接期间,用户标识无法更改&”;
- 套接字连接用户在 swift 中多次触发
- Facebook 连接唯一的秘密用户标识符
- Angular js,如何在调用url之前检查用户是否有互联网连接
- C# & JS WebSocket 某些用户无法连接到服务器
- 断开连接时更新客户端中的用户列表
- 如果突出显示某个单词,并且用户单击了连接单词,请突出显示这两个单词
- 将连接用户发送到客户端会导致范围错误
- 我如何连接用户的输入和功能
- 使用webSocket向特定的连接用户发送消息
- Alfresco连接用户在Alfresco webscript