node.js — Как я могу заставить socket.io PubSub (PHP Predis) подписаться на «сообщение» только один раз?

У меня установлена ​​система Redis PubSub, которая работает с node.js / socket.io / и PHP Predis (https://github.com/nrk/predis) Что ж. Однако у меня возникла проблема с отправкой сообщения уникальному клиенту ОДИН РАЗ — прямо сейчас я могу связаться с моим уникальным клиентом, НО сообщение отправляется столько раз, сколько общего числа клиентов, подключенных к серверу, независимо от уникального адреса электронной почты ( но опять же, по крайней мере, все сообщения отправляются только этому клиенту).

Вот мой код js-сервера — обратите внимание, что у меня есть подписка на ChatChannel, и я создаю комнату для уникальной электронной почты, отправляемой от каждого клиента, — она ​​используется позже для отправки сообщения уникальному клиенту с этой электронной почтой:

// Handle new messages

io.sockets.on (‘соединение’, функция (сокет) {

// Subscribe to the Redis channel
subscribe.subscribe('ChatChannel');

// We are using room of socket io
socket.on('join', function (data) {
socket.join(data.email);
});

// Handle incoming messages
socket.on('send', function (data) {
// Publish it
client.publish('ChatChannel', data.message);
});// Handle receiving messages
var callback = function (channel, data) {

// parse the json response

data = JSON.parse(data);

// this emmits to the desired client BUT sends message several times
// depending on count of clients connected to server
io.sockets.in(data.email).emit('new_msg', {msg: 'hello ' + data.email});

// now check the type to send out the appropriate emit
if (data.type == 'new-mail') {
socket.emit('message', data);
}

};
subscribe.on('message', callback);

// Handle disconnect
socket.on('disconnect', function () {
subscribe.removeListener('message', callback);
});

});

Вот мой код PHP Predis, который успешно публикуется через Redis, НО вызывает «сообщение» на сервере узлов и отправляет несколько уникальному клиенту:

<?php
//First we load the Predis autoloader

require(dirname(__FILE__)."/src/predis/src/Autoloader.php");
//Register all classes

Predis\Autoloader::register();

//Now we can start creating a redis client to publish event
$redis = new Predis\Client(array(
"scheme" => "tcp",
"host" => "127.0.0.1",
"port" => 6379
));

//Now we got redis client connected, we can publish event (send event)

$response = new \stdClass;
$response->email = '[email protected]';
$response->type = 'new-mail';
$response->count = 3;

$redis->publish("ChatChannel", json_encode($response));
?>

Вот мой клиентский код, который обрабатывает сообщение, отправленное с сервера узла (предупреждение появляется несколько раз в зависимости от того, в каких окнах браузера у меня есть эта ссылка на URL этой страницы, и снова только для нужного пользователя — например: если я У этого браузера есть 3 окна по этому URL, и каждое из них представляет собой отдельное электронное письмо, которое отправляется на сервер узла, а затем, когда я отправляю сообщение с сервера узла на window1, скажем, [email protected], три сообщения будут отправлены на window1 для [email protected]):

$(document).ready(function () {
'use strict';

// Set up the connection
var field,
socket,
output;

//console.log(window.location.href);
socket = io.connect('http://localhost:5000/');

// Get a reference to the input
field = $('textarea#message');

// Get a reference to the output
output = $('div.conversation');// room to join for unique users
socket.emit('join', {email: '[email protected]'});

// Handle message submit
$('a#submitbutton').on('click', function () {
// Create the message
var msg;
msg = field.val();
field.val('');
});

// Handle incoming messages
socket.on('message', function (data) {
// Insert the message
output.append('<p>' + data.email + ': ' + data.count + ' unread ' + '</p>');
});

// this code is executed several times for the unique user:
socket.on("new_msg", function(data) {
alert(data.msg);
});});

По сути, я не знаю, что я делаю — документация на socket.io, кажется, не слишком велика.

Спасибо!

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]