Отправленные сервером события с несколькими пользователями

Я пытаюсь написать программу чата с новым API событий, отправленных сервером, однако у меня возникли проблемы с выяснением того, как отправлять разным пользователям разные события. Поскольку весь код происходит из одного PHP-файла, я не уверен, как лучше всего отправлять только определенные события каждому пользователю. Любая помощь, которую вы можете оказать, будет принята с благодарностью. (Я работаю в PHP и Javascript)


person Community    schedule 19.04.2013    source источник
comment
Какую вещь вы хотите отфильтровать, кто что получает? Без кода вообще мы не сможем помочь   -  person Ian    schedule 19.04.2013
comment
Я только что работал над некоторыми тестами, чтобы понять API, прежде чем начать работать над программой чата. Мне нужно контролировать, кто получает уведомление, когда сервер получает новое сообщение. Я уверен, что это основное, но я довольно смущен...   -  person    schedule 19.04.2013
comment
Что ж, если это чат-программа, у вас должна быть какая-то реализация чатов и того, в какой комнате находится пользователь. Исходя из этого, вы должны иметь возможность отправлять сообщения пользователям в чате.   -  person Ian    schedule 19.04.2013
comment
Да, но мне интересно, как вы различаете эти комнаты (я не хочу писать разные наборы кода для каждой из них)   -  person    schedule 19.04.2013
comment
Реальный вопрос stackoverflow.com/questions/15713080/   -  person Mawg says reinstate Monica    schedule 16.02.2017


Ответы (1)


Допустим, ниже приведен код sender.php (один файл php)

echo "event: ping\n";
$msg1="This is first user";
echo 'data: {"msg": "' . $msg1 . '"}';
echo "\n\n";

echo "event: notify\n";
$msg2="This is second user";
echo 'data: {"msg": "' . $msg2 . '"}';
echo "\n\n";

Код javascript первого пользователя будет следующим

var evtSource = new EventSource("sender.php");
evtSource.addEventListener("ping", function(e) {
var obj = JSON.parse(e.data);
var r_msg = obj.msg;

а код javascript второго пользователя будет следующим

var evtSource = new EventSource("sender.php");
evtSource.addEventListener("notify", function(e) {
var obj = JSON.parse(e.data);
var r_msg = obj.msg;

Объяснение кода

Вы можете назначить уникальное имя события каждому пользователю, а затем от отправителя вы просто отправляете данные на это имя события этого конкретного пользователя, в зависимости от того, что вы хотите. В приведенном выше коде пользователь получит сообщения, отправленные только для события ping, и то же самое со вторым пользователем, он получит сообщения, отправленные для уведомления о событии. В приведенном выше коде имя события и сообщения являются статическими, но вы можете сделать их динамическими в соответствии с вашими требованиями.

Надеюсь, это поможет вам.

person Prashant Sushir    schedule 24.04.2013
comment
А если несколько клиентов хотят получить одно и то же событие? И могут ли клиенты отказаться от подписки? (отличный ответ, хотя +1) - person Mawg says reinstate Monica; 16.02.2017
comment
События по-прежнему отправляются всем и только фильтруются на стороне клиента, поэтому все сообщения в основном общедоступны, и каждый несет расходы на получение всех событий. Предлагаемое решение будет работать, но небезопасно и не масштабируемо. - person Mikkel; 20.07.2017