WebSocket API object具有onmessage
属性,并发出message
事件。但是,没有提及frames。那是因为它被抽象了吗?
答案 0 :(得分:0)
该帧是响应的标头+“有效负载”。基本上,WebSocket以这些“框架”的形式相互通信。我们有3个控制框和非控制框。因此,它们只是由我们使用的API编写而成。我们需要握手,每次发射任何东西时都要交换数据帧,以便由API发送。
它们没有被抽象掉。由于从头开始发送服务器请求的想法本质上是完全恒定的,因此只需在其上添加一层即可。数据帧也是如此。您不必一遍又一遍地解码事物,只需阅读“ Hello,World”。
一个典型的框架看起来像这样
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
这些操作由您使用的API处理,并且大多数操作都写在它们之上,以简化操作。要深入了解,我建议您访问有关Websockets from scratch的博客文章。在这里,您会注意到一些不需要理解的红宝石代码,只是有了这样的想法:先从帧中解码字节,然后再读取字节。还有一些代码告诉您如何通过将响应发送到服务器来从头开始Web套接字响应。
"HTTP/1.1 101 Switching Protocols\r\n"
"Upgrade: websocket\r\n"
"Connection: Upgrade\r\n"
"Sec-WebSocket-Accept: #{ws_accept}\r\n" // some off-topic ruby code
您必须先发送此消息才能使用WebSocket,因此此javascript代码可以为您完成此操作
const socket = new WebSocket('ws://localhost:8080');
socket.addEventListener('open', function (event) {
socket.send('Hello Server!');
});
我的观点是,这些并没有被隐藏起来,而是被覆盖了。 就像您不必编写汇编代码来编写“ Hello,world”程序一样,您也可以使用C或C ++来实现。
将扩展名视为在将文件通过电子邮件发送给某人之前对其进行压缩。无论您做什么,都将以不同的形式发送相同的数据。收件人最终将能够获得与本地副本相同的数据,但是发送方式不同。那就是扩展所做的。 WebSockets定义了一种协议和一种简单的数据发送方式,但是诸如压缩之类的扩展可以允许以较短的格式发送相同的数据。
对于POST
请求或任何类型的Web服务器来说都是相同的。它们使我们的生活变得轻松
POST /somescript.cig HTTP/1.0
From: JohnDoe@servername.com
User-Agent: HTTPTool/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 32