Redis Laravel socket.io向除发送方以外的所有人广播
我正在开发带有日历事件的Laravel应用程序 我正在使用socket.io来广播事件(根据这里的课程:) my socket.js文件:Redis Laravel socket.io向除发送方以外的所有人广播,redis,socket.io,laravel-5.1,Redis,Socket.io,Laravel 5.1,我正在开发带有日历事件的Laravel应用程序 我正在使用socket.io来广播事件(根据这里的课程:) my socket.js文件: var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var Redis = require('ioredis'); var redis = new Redis(); redis.sub
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('test-channel', function(err, count) {
//
});
redis.on('message', function(channel, message) {
console.log('Message Received! ' + message);
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function() {
console.log('Listening on *:3000');
});
它可以正常工作,但是当创建事件时,它会被推回给发送者并被复制
我试着用
socket.broadcast.emit(channel + ':' + message.event, message.data);
而不是
io.emit(channel + ':' + message.event, message.data);
但是套接字没有定义
是否有一种方法可以做到这一点,而无需发送带有事件的发件人ID,然后在前端手动检查它?您可以使用此解决方案,但您需要能够将发件人ID发送到Laravel(创建日历条目时),然后将其发布到Redis。 此外,所有客户端都必须将其ID发送到socket.io服务器 在socket.io服务器上,您必须创建某种类型的登录和客户端数据库。例如:
var clients = {};
io.on('connection', function(socket){
//receive login event with login data {senderId:'YourSenderID'}
socket.on('login', function(data){
//save socket ID
clients[data.senderId] = socket.id;
});
});
之后你就可以广播了
redis.on('message', function(channel, message) {
console.log('Message Received! ' + message);
message = JSON.parse(message);
//you need to have senderId here, then you can broadcast for every socket except the socket of calendar entry sender
io.sockets.connected[clients[message.senderId]].broadcast.emit(channel + ':' + message.event, message.data);
});
我不明白这件事是怎么重复的。您正在接收来自Redis的消息,并使用socket.io发送该消息。客户端是否正在将数据发送到正在发布到Redis的其他服务器(您没有提供)?您的服务器正在从Redis订阅,并使用socket.io将其发送回客户端?@galethil在日历视图中创建约会(我们在这里使用DayPilot),然后通过ajax将其数据发送到Laravel。Laravel在数据库中创建它会触发创建的事件,该事件通过redis广播,并在收到消息时发送给所有打开日历视图的人(包括发件人)。DayPilot将约会添加到视图中。因此,在本例中,在“发件人”视图中,它是重复的。谢谢,这一次成功了,添加了:
io.sockets.connected[clients[message.senderId]