2015-09-03 3 views
2

Я разрабатываю приложение Laravel с событиями календаря.Laravel socket.io для всех, кроме отправителя

Я использую 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); 

но сокет не определен.

Есть ли способ, которым я могу это сделать без отправки идентификатора отправителя с событием, а затем вручную проверить его в интерфейсе?

+0

Я не понимаю, как это событие повторяется. Вы получаете сообщение от Redis, и вы отправляете его с socket.io. Является ли клиент, отправляющий данные на другой сервер (который вы не предоставили), который публикует Redis? И ваш сервер подписывается на Redis и выдает с socket.io обратно клиентам? – galethil

+0

@galethil назначение создается в представлении календаря (мы используем DayPilot здесь), а затем его данные отправляются через ajax в Laravel. Laravel создает его в базе данных, запускает созданное событие, которое транслируется через redis, и всем, у кого открыт календарь (включая отправителя), когда сообщение получено, DayPilot добавляет встречу в представление. Таким образом, в этом случае в представлении отправителей он дублируется. – viktorasv

ответ

1

Вы можете использовать это решение, но вы должны иметь возможность отправлять идентификатор отправителя в Laravel (при создании записи календаря), а затем публиковать его в Redis. Также всем клиентам необходимо отправить свои идентификаторы на сервер 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); 
}); 
+0

Спасибо, этот работал, с добавлением: 'io.sockets.connected [clients [message.senderId]]' – viktorasv

Смежные вопросы