如何使用服务器发送的事件在客户端使用 java 脚本并在服务器端使用 java 向多个用户广播

How to use server sent event to broadcast to multiple users using javascript at client end and java at server end

我正在使用服务器发送事件编写 Web 应用程序代码,我想在其中向某些特定用户广播消息。我想在客户端使用 eventsource,在服务器端使用 jersey broadcaster。如果他们有任何其他方式来实现它。 由于 tomcat 版本和我无法在应用程序中使用的长轮询,我的应用程序不支持 Websockets。

任何人都可以分享示例和工作代码。 提前致谢

我看到的解决方案可能是使用两个不同的 EventSource 来处理特定用户和标准用户。这意味着两个不同的网址。 在示例代码 there 中,我使用查询参数来区分这两种用户,但您也可以使用不同的路径(取决于您的 use-case)。

当我们的用户想通过 streamdata.io 将他们的 JSON API 变成推送 API 时,他们通常会这样做(streamdata.io 基于SSE)(免责声明:我是开发人员@streamdata.io)。

使用streamdata.io JS SDK,您还可以使用headers来区分您的用户。请注意,SSE 不支持自定义 headers:您需要使用查询参数。

如果你的 use-case 依赖于 JSON API 并且你想推送数据,你可以使用 streamdata.io ;).

根据您的用例,另一种解决方案是为不同类型的用户使用一个 EventSource 和不同的消息。例如,标准用户只能收听“标准”类型的消息,特殊用户只能收听“特殊”类型的消息。

在这种情况下,由客户端根据用户的种类过滤/区分监听哪些事件。但是由于只有一个事件源,您可以让客户端应用程序可以收听两种类型的消息。

因此,选择一个或另一个解决方案实际上取决于用例。

我已经在同一个 github 上提交了这个解决方案。解决方案 1 标记为 « v1 »,解决方案 2 标记为 « v2 »。

您可以在服务器端创建不同的事件,然后客户端将只监听与它们相关的事件。

服务器端

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;