Laravel socket.io向除发件人之外的所有人广播

时间:2015-09-03 09:28:34

标签: redis socket.io laravel-5.1

我正在使用日历活动开发Laravel应用程序。

我正在使用socket.io来广播事件(根据这里的课程:https://laracasts.com/lessons/broadcasting-events-in-laravel-5-1#

我的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的情况下执行此操作,然后在前端手动检查它?

1 个答案:

答案 0 :(得分:1)

您可以使用此解决方案,但您需要能够将发件人ID发送到Laravel(创建日历条目时),然后将其发布到Redis。 此外,所有客户端都必须将其ID发送到socket.io服务器。

在您的socket.io服务器上,您必须创建某种类型的客户端登录和数据库。 E.g:

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