https://stackoverflow.com/a/42465368/462608
网络套接字在哪里还有一席之地?最大的是服务器->浏览器推送的二进制数据。HTTP/2确实允许服务器->浏览器推送了二进制数据,但它没有在浏览器JS中公开。对于像推送音频和视频帧这样的应用程序,这是使用websocket的一个原因。
当他们说推送的二进制数据没有在浏览器JS中公开时,这意味着什么?我请求一些例子来帮助我理解这一点。
https://stackoverflow.com/a/47108355
因此HTTP2推送实际上是介于浏览器和服务器之间的东西,而Websockets实际上公开了客户端(javascript,如果在浏览器上运行)和应用程序代码(在服务器上运行)都可以使用的API,用于传输实时数据。
我请求一些示例来让我理解HTTP2 push is really something between your browser and server
的含义,并且Websockets(socket.io)具有客户端可以使用的API。
这一切意味着什么?
这里,我们讨论的是服务器和客户端之间的双向(bidi)消息传递。在您的案例/问题中,客户端是浏览器。
要了解发生了什么,我们应该了解什么是HTTP/2和WebSocket。
- 两者都是与应用层相关的协议
- HTTP/2是HTTP/1的继承者。而WebSocket不同于HTTP,它是为提供客户端和服务器之间的全双工通信而创建的
- HTTP/2支持双向流,但您不能通过JavaScript访问该流
- HTTP/2可以使用该流来";"推";数据到浏览器。但推送的数据将只由浏览器处理,您的JavaScript对此一无所知。它可以被服务器用来推送额外的资源。例如,Browser请求了index.html,而具有index.html的服务器也返回了index.css,因为它知道Browser会请求index.css。因此,当浏览器开始解析index.html并在index.css上找到链接时,它会从缓存中获取它
- WebSocket提供双向流,您可以通过JavaScript访问该流。因此,您可以使用
send
方法将消息推送到服务器。反之亦然,服务器可以使用相同的流/通道将消息推送到浏览器
所以现在我们可以尝试回答的问题
当他们说推送的二进制数据没有在浏览器JS中公开时,这意味着什么?
这意味着如果服务器";"推";关于您请求的其他数据,您在JavaScript中不会知道。
fetch('/index.html')
// Server respond with index.html data and
// "Push" index.css data but in response you get only index.html data
.then((res) => res.text()).then(console.log) // Only index.html data
因此HTTP2推送实际上是介于浏览器和服务器之间的东西,而Websockets实际上公开了客户端(javascript,如果在浏览器上运行)和应用程序代码(在服务器上运行)都可以使用的API,用于传输实时数据。
HTTP/2";按下"浏览器可以使用ed附加数据来完成浏览器缓存。你可以在这里阅读。使用WebSocket,您可以使用JavaScript 中的WebSocketonmessage
属性获取任何由服务器推送的数据
websocket.addEventListener('message', (data) => {
console.log(data) // Pushed by server data
})
但是!浏览器提供服务器发送事件(SSE)功能,允许您在只读模式下使用HTTP/2流。这意味着您可以订阅服务器事件,但不能将事件从客户端发送到服务器。因此,它只在一个方向上工作(从服务器到客户端)。此外,如果服务器不支持SSE 的HTTP/1.x上的HTTP/2浏览器回退