Как сделать так, чтобы socket.io PubSub (PHP Predis) subse.on 'message' отправлял уникальному клиенту только один раз?

У меня есть система 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@email.com';
$response->type = 'new-mail';
$response->count = 3;

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

Вот мой клиентский код, который обрабатывает сообщение, отправленное с сервера узла (предупреждение появляется несколько раз в зависимости от того, в каких окнах браузера у меня есть эта ссылка на URL этой страницы, и снова только для нужного пользователя - например: если я у этого браузера три окна по этому URL, и каждое из них представляет собой отдельное электронное письмо, которое отправляется на сервер узла, а затем, когда я отправляю сообщение с сервера узла на window1, скажем, email1@email.com, три сообщения будут отправлены на window1 для email1@email.com):

$(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: 'email1@email.com'});

// 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, кажется, не слишком велика.

Спасибо!

0 ответов

Другие вопросы по тегам