当前位置: 首页 > 知识库问答 >
问题:

服务器发送事件(SSE):如何广播消息?

微生嘉祥
2023-03-14

我想要实现的是:

$.post('events.php', {'message': 'hello world'}, function(res) {
 
});
  • user1向服务器发送消息(一个简单的POST请求)

服务器部分是(events.php)

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.

function sendMsg($id, $msg) {
    echo "id: $id" . PHP_EOL;
    echo "data: $msg" . PHP_EOL;
    echo PHP_EOL;
    ob_flush();
    flush();
}

while(true) {
    $serverTime = time();
    if (isset($_POST['message'])) {
        sendMsg($serverTime, 'message: ' . date("h:i:s", time()));
        sleep(5);
    }
}

我在(true)时尝试了无限循环以避免3秒的轮询。我也尝试过没有那个无限循环。只有发送消息的用户收到事件。

我理解这种做法并不好。但是,将SSE用于聊天应用程序的最佳实践是什么?

如何向所有用户发送事件?

共有1个答案

乐正涵忍
2023-03-14

SSE是每个客户端的专用套接字和专用进程。

这意味着您的服务器端进程与浏览器客户端的选择基本相同:轮询或订阅。

由于您的数据库可能与SSE服务器进程位于同一服务器/局域网上,因此重复轮询的缺点与浏览器客户端不同。因此,要创建一个聊天应用程序,您可以定期轮询存储聊天消息的SQL数据库,以查看是否有新消息。

subscribe方法的一个示例是让每个SSE进程打开一个本地运行的聊天服务器专用套接字,每当新聊天消息到达时,该套接字将广播给这些SSE侦听器。

 类似资料:
  • 我是 SSE(服务器发送事件)的新手。我找到了一种在Spring启动中使用SSE发送响应的方法。我能够每 20 秒发送一次响应。我用下面的代码做同样的事情。 但问题是,这个方法每20秒就被调用一次。 但是,我的要求是每20秒向客户端发送一次空响应,并在新用户添加到数据库时发送响应。 如何实现我的目标?或者我在概念上完全错了。

  • 您好,我正在React中开发一个web应用程序,它使用Nginx从Express服务器接收SSE数据。 JS服务器 索引:JS const events=新事件源('https://api.myDomain.com/events', ); axios。post(<代码>https://api.myDomain.com/addCart,{客户端:this.state.clientId,购物车:car

  • 我有一个ASP。net core 3.1服务器项目,它有一个非常简单的API发送单向服务器发送事件(SSE),如下所示: 现在,我想通过C#UWP客户端接收这些事件。很遗憾,我只收到第一个事件: 如何在UWP中创建行为以始终监听该连接并接收我可以进一步处理的事件?

  • 我有以下Quarkus资源: 这将生成没有事件名称的事件,并且只生成数据部分。如何指定事件名称?

  • 我已经在Java服务器中设置了SSE(服务器发送事件)。客户端构建在VueJS上,并使用EventSource包从服务器接收事件。我正在使用EventSourcePolyfill npm包https://www.npmjs.com/package/event-source-polyfill在客户端上。这个包允许我们在请求中发送授权头(针对我们的安全方案)。 客户端向我们的SSE服务发送请求并接收一

  • 我无法理解HTML5s服务器发送的事件是否真的适合ReST体系结构。我知道并非HTML5/HTTP的所有方面都需要适合ReST架构。但我想从专家那里知道HTTP的哪一半是SSE(ReSTful的一半还是另一半!)。 一种观点是它是ReSTful的,因为客户端向服务器发出了一个“初始”HTTP GET请求,其余的只能看作是不同内容类型的部分内容响应(“文本/事件流”) 发送的请求不知道有多少响应将作