gpt4 book ai didi

redis - Laravel socket.io 向除发送者以外的所有人广播

转载 作者:IT王子 更新时间:2023-10-29 06:06:38 26 4
gpt4 key购买 nike

我正在开发带有日历事件的 Laravel 应用程序。

我正在使用 socket.io 广播事件(根据此处的类(class):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 然后在前端手动检查它的情况下执行此操作?

最佳答案

您可以使用此解决方案,但您需要能够将发件人 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 - Laravel socket.io 向除发送者以外的所有人广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32371838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com