Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js HTTP流和服务器发送事件之间有什么区别?_Node.js_Http_Server Sent Events_Http Streaming - Fatal编程技术网

Node.js HTTP流和服务器发送事件之间有什么区别?

Node.js HTTP流和服务器发送事件之间有什么区别?,node.js,http,server-sent-events,http-streaming,Node.js,Http,Server Sent Events,Http Streaming,我的理解是,HTTP流包括客户端发送HTTP请求,然后响应随时间发送的请求,从而允许服务器实质上推送到客户端。在我所读到的内容中,SSE似乎遵循同样的原则,但更正式。这接近于正确的理解吗 我看到了这些问题,但它们并没有直接回答我的问题 我也看了这个 关于设置SSE的教程,看起来就像我想象的HTTP流是如何设置的 SSE实际上是HTTP流的一种形式。它只是一个HTTP响应,MIME类型为“文本/事件流”,它发送以双换行符结尾的纯文本消息 SSE并不是以前不可能做到的事情,但该网站必须使用Web

我的理解是,HTTP流包括客户端发送HTTP请求,然后响应随时间发送的请求,从而允许服务器实质上推送到客户端。在我所读到的内容中,SSE似乎遵循同样的原则,但更正式。这接近于正确的理解吗

我看到了这些问题,但它们并没有直接回答我的问题

我也看了这个
关于设置SSE的教程,看起来就像我想象的HTTP流是如何设置的

SSE实际上是HTTP流的一种形式。它只是一个HTTP响应,MIME类型为“文本/事件流”,它发送以双换行符结尾的纯文本消息

SSE并不是以前不可能做到的事情,但该网站必须使用WebSocket连接、AJAX长轮询、comet、定期轮询等。现在使用SSE,API已经标准化,实现非常简单。见:

需要记住的一点是,IE(包括Edge和IE Mobile)不支持SSE:


因此,除非您知道他们使用什么浏览器,否则您还无法真正将其用于更广泛的受众。

IMHO,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) {
    ...
}

服务器发送事件的限制:

  • SSE事件使用浏览器打开的连接
  • 对最大打开连接数的限制不是在浏览器选项卡级别,而是整个浏览器级别
  • 我写这篇文章的时候,Chrome&Firefox把它设为6(太低了)。此限制是针对每个浏览器+域的,因此这意味着您可以在所有选项卡上打开6个SSE连接,然后再打开6个SSE连接
HTTP流媒体

在许多用例中,HTTP流可能很有用。如果我们只对来自服务器的消息流感兴趣,这可能很方便

示例场景:

假设我们喜欢将日志文件内容流式传输到客户端。它可能是一个巨大的文件,或者文件内容不断更新,我们喜欢将其发送给客户端(如日志尾)。在这种情况下,HTTP流(
传输编码: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();
            });
        }
    });
}

流响应的限制:

  • 对于流响应(分块)-HTTP/2不支持HTTP 1.1的分块传输编码机制,因为它为数据流提供了自己的、更高效的机制

我不知道你为什么会被否决,这听起来不错。谢谢那么,到底有什么区别呢?这个问题不能回答这个问题。如果两者都是相同的(除了您所说的mime类型头),那么在我们已经有http流的情况下引入SSE又有什么意义呢?我觉得这个问题还有很多。@程序员说,这是对“松散定义”之前的标准化。它还引入了更简单的浏览器API来处理此问题。MDN说:
当不通过HTTP/2使用时,SSE受到最大打开连接数的限制,这在打开多个选项卡时可能会特别痛苦,因为限制是每个浏览器的,并且设置为非常低的数字(6)
到2020年,您对此有何看法?这个限额还存在吗?如果是的话,那么我们一开始就不应该使用这种技术,而是更喜欢WebSocket连接之类的东西?你怎么认为?非常感谢。