我正在使用日历活动开发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的情况下执行此操作,然后在前端手动检查它?
答案 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);
});