Laravel socket.io 向除发件人以外的所有人广播
Laravel socket.io broadcast to everyone except the sender
我正在开发 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 然后在前端手动检查它的情况下执行此操作?
您可以使用此解决方案,但您需要能够将发件人 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);
});
我正在开发 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 然后在前端手动检查它的情况下执行此操作?
您可以使用此解决方案,但您需要能够将发件人 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);
});