【问题标题】:Laravel socket.io broadcast to everyone except the senderLaravel socket.io 向除发送者之外的所有人广播
【发布时间】:2015-09-03 09:28:33
【问题描述】:

我正在开发带有日历事件的 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,然后在前端手动检查它?

【问题讨论】:

  • 我不明白事件是如何重复的。您正在接收来自 Redis 的消息,并且您正在使用 socket.io 发送它。客户端是否将数据发送到发布到 Redis 的其他服务器(您没有提供)?而您的服务器正在从 Redis 订阅并使用 socket.io 向客户端发送?
  • @galethil 约会是在日历视图中创建的(我们在这里使用 DayPilot),然后它的数据通过 ajax 发送到 Laravel。 Laravel 在数据库中创建它触发创建的事件,该事件通过 redis 广播,并在收到消息时向所有打开日历视图的人(包括发件人)广播 DayPilot 将约会添加到视图中。所以在这种情况下,在发件人视图中它是重复的。

标签: redis socket.io laravel-5.1


【解决方案1】:

您可以使用此解决方案,但您需要能够将发件人 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);
});

【讨论】:

  • 谢谢,这个成功了,加上:io.sockets.connected[clients[message.senderId]]
猜你喜欢
  • 2023-02-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 2015-05-29
  • 2020-11-23
  • 1970-01-01
  • 2013-06-13
相关资源
最近更新 更多