WebSocket对象是否将框架抽象化?

时间:2019-07-12 15:25:07

标签: javascript websocket

WebSocket API object具有onmessage属性,并发出message事件。但是,没有提及frames。那是因为它被抽象了吗?

1 个答案:

答案 0 :(得分:0)

该帧是响应的标头+“有效负载”。基本上,WebSocket以这些“框架”的形式相互通信。我们有3个控制框和非控制框。因此,它们只是由我们使用的API编写而成。我们需要握手,每次发射任何东西时都要交换数据帧,以便由API发送。

它们没有被抽象掉。由于从头开始发送服务器请求的想法本质上是完全恒定的,因此只需在其上添加一层即可。数据帧也是如此。您不必一遍又一遍地解码事物,只需阅读“ Hello,World”。

一个典型的框架看起来像这样

Frame format

  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 ++来实现。

Extensions

  

将扩展名视为在将文件通过电子邮件发送给某人之前对其进行压缩。无论您做什么,都将以不同的形式发送相同的数据。收件人最终将能够获得与本地副本相同的数据,但是发送方式不同。那就是扩展所做的。 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