Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis Laravel socket.io向除发送方以外的所有人广播_Redis_Socket.io_Laravel 5.1 - Fatal编程技术网

Redis Laravel socket.io向除发送方以外的所有人广播

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

我正在开发带有日历事件的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.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]