У меня установлена система 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, кажется, не слишком велика.
Спасибо!
Задача ещё не решена.
Других решений пока нет …