服务器发送事件(SSE)是HTML5规范的一部分。 SSE允许客户端和服务器之间的单向持久连接,使得客户端仅发出单个请求,并且服务器持续不断地将数据推送到客户端,直到连接关闭。
我正在开发一个带有 Angular 前端的 Spring Boot 应用程序,并且使用 Keycloak 进行身份验证和授权。该应用程序依赖服务器发送事件 (SSE) 来实现实时
服务器发送事件(SSE)无法重新建立链接。净::ERR_INCOMPLETE_CHUNKED_ENCODING
我正在使用springboot开发server-sent-events推送到浏览器的功能。当我完成开发时,第一次总是可以建立server-sent-events连接,但是
我目前正在尝试使用 SSE 设置实时列表。除了查询需要身份验证的数据外,一切都按预期工作。我正在使用 JWT 并有 axios interc...
仅通过 dJango SSE 服务器端事件在 POST 请求上广播数据
一旦用户发出请求,我就会尝试向所有客户端广播 SSE。 我能够启动并运行这个基本示例 异步定义仪表板_oc_接口(请求): ”“” ...
我的golang服务器代码 包主 进口 ( “FMMT” “日志” “网络/http” “github.com/rs/cors” ) 函数主() { mux := http.NewServeMux(); ...
Axios 的 ReadableStream 不能在 Safari 中工作,但可以在 Chrome 和 Firefox 中工作
我正在使用 AI API(例如 ChatGPT)构建一个聊天应用程序。我正在流式传输响应,这在 chrome 和 firefox 中工作正常,但在 Safari 中不行。我总是收到这个错误: [日志] 错误:(
我需要使用一个 eventsource API,但它是一个私有 API,我需要传递一些身份验证标头,特别是授权标头,等等。 我查看了这两个箱子(
Puppeteer Scraper 无法访问 Node.js 服务器中已连接的客户端
我正在使用 Node.js、Express、Puppeteer 和 MongoDB 开发一个 Web 应用程序。我的目标是创建一个抓取工具,通过服务器发送事件 (SSE) 向连接的客户端发送实时更新。豪...
我对事件流的工作原理有基本的了解。我目前正在将 langchain 代码转换为直接使用 OpenAI 的 API,我有一段代码我有点困惑。 defstream_messag...
我尝试使用SSE将更新发送到客户端,但是当我在服务器端触发事件时,新数据不会发送到客户端。 我的客户端代码: $(文档).准备好(</desc> <question vote="1"> <p>我尝试使用SSE将更新发送到客户端,但是当我在服务器端触发事件时,新数据不会发送到客户端。</p> <p>我的客户端代码:</p> <pre><code><script> $(document).ready(function($) { var lastMsg = ''; const source = new EventSource("/misc/getData"); source.onmessage = function(event) { console.log(event); var data = JSON.parse(event.data); if (data !== lastMsg) { $('#result').empty(); $('#result').append('Result: ' + data); lastMsg = data; } }; }); </script> </code></pre> <p>我的服务器端代码(Laravel 类)</p> <pre><code><?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; class MiscController extends Controller { private $data; public function __construct() { $this->data = ''; } public function sendContent(Request $request) { $content = $request['content']; if (!is_null($content)) { $this->data = "data:". $content ."\n\n"; } $this->getData(); } public function getData() { return response($this->data)->withHeaders(['Content-Type'=>'text/event-stream', 'Cache-Control'=>'no-cache']); } } </code></pre> <p>没有显示错误,标题在浏览器控制台中看起来正常,但当服务器端设置数据时我无法获取数据。<br/> <pre><code>sendContent</code></pre> 方法在服务器端由其他类调用,或者从客户端使用 AJAX 调用,以设置需要反映在 UI 上的内容。</p> <p>然而,客户端的<pre><code>onmessage</code></pre>函数永远无法获取到它。</p> <p>我也尝试使用静态方法接收内容作为参数,但没有成功。</p> <p>我错过了什么?</p> </question> <answer tick="true" vote="0"> <p>这就是 Laravel 中 CORS 问题的答案。</p> <p>这与我之前使用的 Laravel 版本不同,但问题是相同的,因为我没有正确返回响应对象。也就是说,具有正确的标头以及包含在 Response 对象中的内容或有效负载。</p> <p><a href="https://stackoverflow.com/questions/78533267/laravel-11-cors-issue/78651491#78651491">Laravel 11 CORS 问题</a></p> </answer> </body></html>
无法使用 nginx、fastcgi 和 bash 禁用 cgi 上的缓冲
我想制作一个CGI来启动程序并在网络浏览器中实时显示输出。这里的实时意味着一旦程序产生一行输出,它就应该显示...
Eventsource API:例外:300000 毫秒内没有活动。重新连接
我正在使用 eventSource API 并将 addEventListener() 添加到 eventsouce。事件源仅激活 45 秒。我想保持连接处于活动状态,直到服务器发送响应...
我发现这里的代码有奇怪的行为。 客户端(Javascript): 我在代码这里看到了奇怪的行为。 客户端(Javascript): <input type="text" id="userid" placeholder="UserID" /><br /> <input type="button" id="ping" value="Ping" /> <script> var es = new EventSource('/home/message'); es.onmessage = function (e) { console.log(e.data); }; es.onerror = function () { console.log(arguments); }; $(function () { $('#ping').on('click', function () { $.post('/home/ping', { UserID: parseInt($('#userid').val()) || 0 }); }); }); </script> 服务器端(C#): using System; using System.Collections.Concurrent; using System.Threading; using System.Web.Mvc; using Newtonsoft.Json; namespace EventSourceTest2.Controllers { public class PingData { public int UserID { get; set; } public DateTime Date { get; set; } = DateTime.Now; } public class HomeController : Controller { public ActionResult Index() { return View(); } static ConcurrentQueue<PingData> pings = new ConcurrentQueue<PingData>(); public void Ping(int userID) { pings.Enqueue(new PingData { UserID = userID }); } public void Message() { Response.ContentType = "text/event-stream"; do { PingData nextPing; if (pings.TryDequeue(out nextPing)) { var msg = "data:" + JsonConvert.SerializeObject(nextPing, Formatting.None) + "\n\n"; Response.Write(msg); } Response.Flush(); Thread.Sleep(1000); } while (true); } } } 一旦我按下 ping 将新项目添加到 pings 队列中,Message 方法内的循环就会拾取新项目并通过 Response.Write 发出事件(在服务器上使用 Debug.Print 进行确认) )。但是,浏览器不会触发 onmessage,直到我第二次按 ping,并且浏览器发出另一个事件;此时,来自 first 事件的数据达到 onmessage。 我该如何解决这个问题? 澄清一下,这是我期望的行为: Client Server ------------------------------------------------------------------- Press Ping button XHR to /home/ping Eneque new item to pings Message loop issues server-sent event EventSource calls onmessage 这就是实际发生的事情: Client Server ------------------------------------------------------------------- Press Ping button XHR to /home/ping Eneque new item to pings Message loop issues server-sent event (Nothing happens) Press Ping button again New XHR to /home/ping EventSource calls onmessage with previous event data (在 Chrome 中运行时,message 请求在“网络”选项卡中列为始终处于待处理状态。我不确定这是否是服务器发送事件的正常行为,或者可能与该问题有关。) 编辑 msg之后的Response.Write变量的字符串表示如下所示: "data:{\"UserID\":105,\"Date\":\"2016-03-11T04:20:24.1854996+02:00\"}\n\n" 非常清楚地包括换行符。 这并不是一个答案,但希望它能带来一个答案。我能够使用以下代码让它工作。 public void Ping(int id) { pings.Enqueue(new PingData { ID = id }); Response.ContentType = "text/plain"; Response.Write("id received"); } public void Message() { int count = 0; Response.ContentType = "text/event-stream"; do { PingData nextPing; if (pings.TryDequeue(out nextPing)) { Response.ClearContent(); Response.Write("data:" + nextPing.ID.ToString() + " - " + nextPing.Date.ToLongTimeString() + "\n\n"); Response.Write("event:time" + "\n" + "data:" + DateTime.Now.ToLongTimeString() + "\n\n"); count = 0; Response.Flush(); } if (!Response.IsClientConnected){break;} Thread.Sleep(1000); count++; } while (count < 30); //end after 30 seconds of no pings } 产生差异的代码行是第二个Response.Write。该消息不会出现在浏览器中,直到下一个类似于您的问题的 ping 操作,但该 ping 操作始终会出现。如果没有该行,只有在下一个 ping 之后,或者在我的 30 秒计数器用完后,才会出现 ping。 30 秒计时器后出现的丢失消息让我得出结论,这要么是 .Net 问题,要么是我们遗漏了某些内容。这似乎不是事件源问题,因为该消息出现在服务器事件上,并且我使用 PHP 执行 SSE 没有遇到任何问题。 作为参考,这里是我用来测试的 JavaScript 和 HTML。 <input type="text" id="pingid" placeholder="ID" /><br /> <input type="button" id="ping" value="Ping" /> <div id="timeresponse"></div> <div id="pingresponse"></div> <script> var es = new EventSource('/Home/Message'); es.onmessage = function (e) { console.log(e.data); document.getElementById('pingresponse').innerHTML += e.data + " - onmessage<br/>"; }; es.addEventListener("ping", function (e) { console.log(e.data); document.getElementById('pingresponse').innerHTML += e.data + " - onping<br/>"; }, false); es.addEventListener("time", function (e) { document.getElementById('timeresponse').innerHTML = e.data; }, false); es.onerror = function () { console.log(arguments); console.log("event source closed"); es.close(); }; window.onload = function(){ document.getElementById('ping').onclick = function () { var xmlhttp = new XMLHttpRequest(); xmlhttp.onload = function () { console.log(this.responseText); }; var url = '/Home/Ping?id=' + document.getElementById('pingid').value; xmlhttp.open("GET", url); xmlhttp.send(); }; }; </script> 由于事件流只是文本数据,因此在将第一个事件写入响应之前缺少双换行符可能会影响客户端。 mdn docs 中的示例表明 header("Content-Type: text/event-stream\n\n"); 这可以应用于 .NET 响应处理(注意 Response.ClearContent() 的副作用)。 如果感觉太老套,您可以通过保持活动的评论开始您的流(如果您想避免超时,您可能需要定期发送评论): : just a keep-alive comment followed by two line-breaks, Response.Write me first 我不确定这是否有效,因为我现在无法尝试,但是添加一个 End 怎么样?: Response.Flush(); Response.End(); .net 的默认行为是序列化对会话状态的访问。它阻止并行执行。请求按顺序处理,并且对会话状态的访问是会话独有的。您可以覆盖每个类的默认状态。 [SessionState(SessionStateBehavior.Disabled)] public class MyPulsingController { } 问题中对此有一个说明这里。 编辑:您可以尝试先创建对象,然后将其传递给 Enqueue 吗?如: PingData myData = new PingData { UserID = userID }; pings.Enqueue(myData); 可能会发生一些奇怪的事情,Dequeue 认为它已经完成了工作,但 PingData 对象尚未正确构造。 我们也可以尝试用console.log("I made it to the function")代替console.log(e.data)。 ---- 以下要求提供的先前信息 ---- 请确保服务器Debug.Print确认这行代码: Response.Write("data:" + JsonConvert.SerializeObject(nextPing, Formatting.None) + "\n\n"); 实际执行了吗?请仔细检查这一点。如果您可以捕获服务器发送的响应,那么我们可以看到它是什么吗? 我们还可以看看您在哪些浏览器上进行了测试吗?并非所有浏览器都支持服务器事件。
我正在使用 Spring 的 SseEmitter 实现来处理 SSE。 就我而言,我想在服务器端找不到项目时处理错误并发送带有错误消息的事件。 我的第一个想法是......
使用 API 网关将 SSE 从 AWS 流式传输到 Angular 客户端
有哪些方法可以支持 AWS 中的服务器发送事件传输到 Angular 客户端?我们有一个基于微服务的 AWS 后端,使用 API 网关和 lambda。我们想发布真实的...
使用HttpServletRequest.newPushBuilder()实现SSE(服务器发送事件)总是返回null
我是 SSE 的新手 - 服务器发送事件实现。 我正在尝试使用 java jakarta.HttpServletRequest 实现 SSE。 导入java.io.IOException; 导入 jakarta.servlet.annotation.WebServlet; 我...
这样我就理解了服务器发送事件(EventSource)的概念: 客户端通过 EventSource 连接到端点 客户端仅监听从端点发送的消息 我很困惑的事情...
我正在开发一个使用 Nextjs/redis 的测试应用程序(目前)。 我的 sse 端点工作(有点)正确。当客户端连接时,它会检索快照并将其发回,当更新时...
我正在尝试在 NodeJS 服务器和 TypeScript 前端之间设置 SSE。我的服务器代码如下所示: 让 sseInterval: { [index: string]: NodeJS.Timer } = {}; this.app.get('/events/:id', ...
我正在尝试构建一个通知系统,在我的后端,在收到来自第三方的 Webhook 后,将通知前端特定状态,并决定继续进行