Bre*_*ren 7 http node.js http-streaming server-sent-events
我的理解是HTTP流式传输涉及客户端发送HTTP请求,然后响应随时间发送的请求,允许服务器基本上推送到客户端.在我所看到的情况下,SSE似乎按照相同的原则运作,但更为正式化.这接近正确的理解吗?
我看到了这些问题,但他们并没有直接回答我的问题.
HTTP:流水线,保持活动和服务器发送事件之间的关系是什么? 什么是长轮询,Websockets,服务器发送事件(SSE)和Comet?
我还查看了这个https://www.html5rocks.com/en/tutorials/eventsource/basics/#disqus_thread 教程来设置SSE,看起来我想象的是如何设置HTTP流.
恕我直言,HTTP2 服务器发送的事件比 HTTP 流具有丰富的功能。
在单向数据流(服务器 -> 客户端)中,客户端可以根据后端事件进行编排,服务器发送的事件可能是一个不错的选择。
例如:
# ---------- client side -----------
const eventSource = new EventSource("//your-api/workflow/state");
eventSource.addEventListener("queued", function(event) {
...
}
eventSource.addEventListener("started", function(event) {
...
}
eventSource.addEventListener("failed", function(event) {
...
}
eventSource.addEventListener("success", function(event) {
...
}
Run Code Online (Sandbox Code Playgroud)
服务器发送事件的限制:
HTTP 流式传输
HTTP 流在许多用例中都非常有用。如果我们只对来自服务器的消息流感兴趣,这可能会很方便。
示例场景:
假设我们想将日志文件内容流式传输到客户端。它可能是一个巨大的文件,或者文件内容不断更新,我们喜欢将其发送给客户端(如日志尾部)。在这种情况下,HTTP Stream( Transfer-Encoding: chunked)就可以满足我们的需求。
# ---------- client side -----------
const streamRequest = (url) => {
fetch(url).then(function (response) {
let reader = response.body.getReader();
let decoder = new TextDecoder();
return readData();
function readData() {
return reader.read().then(function ({value, done}) {
console.log(value)
if (value) {
let newData = decoder.decode(value, {stream: !done});
console.log(newData);
}
if (done) {
console.log('end of stream');
return;
}
return readData();
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
流响应的局限性:
SSE实际上是HTTP流式传输的一种形式.它只是一个MIME类型为"text/event-stream"的HTTP响应,它发送以双换行符结尾的纯文本消息.
SSE不是以前不可能做到的事情,但网站必须使用WebSocket连接,AJAX长轮询,彗星,定期轮询等,现在SSE API已经标准化,实现非常简单.看到:
https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
要记住的一件事是IE不支持SSE,包括Edge和IE Mobile:
因此,除非您知道他们使用的浏览器,否则您无法真正将它用于更广泛的受众.
| 归档时间: |
|
| 查看次数: |
1109 次 |
| 最近记录: |