Как использовать отправленное сервером событие для трансляции нескольким пользователям с использованием javascript на стороне клиента и java на стороне сервера

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

Может ли кто-нибудь поделиться примером с рабочим кодом. заранее спасибо


person Anshul    schedule 21.07.2015    source источник
comment
stackoverflow.com/questions/15713080/. Почти такое же требование, но не такое сложное. Просто несколько пользователей вошли в систему в каком-то представлении, и я должен иметь возможность отправлять уведомления некоторым конкретным пользователям. Я не могу использовать атмосферу или любую стороннюю структуру.   -  person Anshul    schedule 21.07.2015


Ответы (3)


В зависимости от вашего варианта использования другим решением может быть использование одного EventSource и разных сообщений для разных типов пользователей. Например, обычные пользователи могли слушать только сообщения типа «стандарт», а специальные пользователи могли слушать только сообщения типа «особые».

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

Таким образом, выбор того или иного решения действительно зависит от варианта использования.

Я зафиксировал это решение на том же github. Решение 1 помечено как «v1», решение 2 помечено как «v2».

person ctranxuan    schedule 23.07.2015
comment
Можешь поделиться ссылкой на гитхаб - person Anshul; 23.07.2015
comment
Ссылка на github в другом моем посте не изменилась: она здесь. - person ctranxuan; 23.07.2015

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

Обычно это то, что делают наши пользователи, когда хотят превратить свой JSON API в push API через streamdata.io (streamdata.io основан на SSE) (отказ от ответственности: я разработчик @streamdata.io).

С помощью SDK streamdata.io JS вы также можете использовать заголовки, чтобы отличать своих пользователей. Обратите внимание, что SSE не поддерживает пользовательские заголовки: вам нужно использовать параметры запроса.

Если когда-либо ваш вариант использования опирается на JSON API и вы хотите передавать данные, вы можете использовать streamdata.io ;).

person ctranxuan    schedule 22.07.2015
comment
Я пытаюсь запустить этот пример в Tomcat 8.0. Но я получаю ошибку 404. Затем я добавил ‹dependency› ‹groupId›com.sun.jersey‹/groupId› ‹artifactId›jersey-servlet‹/artifactId› ‹version›1.19‹/version› ‹/dependency› После этого я получаю 500 ошибок. Можете ли вы проверить, что я делаю неправильно. - person Anshul; 23.07.2015
comment
В примере используется SpringBoot, который сам использует встроенный Tomcat 8 для запуска приложения. Таким образом, выполнение jar-файла запустит встроенный Tomcat 8. Но если вы хотите развернуть войну в Tomcat 8, вам нужно сделать некоторые modifications и обновите index.html, указав правильные URL-адреса источника событий. Я сделал ветку tomcat-deployment в репозитории github. Просто запустите mvn clean install, чтобы создать войну и развернуть ее на своем Tomcat. См. README.md. - person ctranxuan; 23.07.2015
comment
можете ли вы предоставить ссылку на ветку tomcat-deployment - person Anshul; 23.07.2015
comment
В поисках решений я могу найти это. Я новичок в maven, поэтому не могу заставить его работать. Некоторая проблема с pom.xml github.com/jersey/ jersey/tree/master/examples/ не могли бы вы взглянуть на это, пожалуйста. - person Anshul; 23.07.2015
comment
Для проверки ветки git вас может заинтересовать это. Что касается материала maven, вы можете опубликовать еще один вопрос о стеке для своей проблемы ... или адаптировать код образца Джерси к моему. - person ctranxuan; 23.07.2015

вы можете создавать различные события на стороне сервера, и тогда клиент будет слушать только те события, которые для него актуальны.

на стороне сервера

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

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

специальная пользовательская клиентская часть

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

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

var evtSource = new EventSource("sender.php");
evtSource.addEventListener("normal_user", function(e) {
obj = JSON.parse(e.data);
var r_msg = obj.msg;
person Anush    schedule 07.10.2019