繁体   English   中英

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

[英]Does the WebSocket object abstract away frames?

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

帧是响应的标题+“有效负载”。 基本上,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的博客文章。 在这里,您会注意到一些不需要理解的红宝石代码,只是有了这样的想法:先从帧中解码字节,然后再读取字节。 还有一些代码告诉您如何通过将响应发送到服务器来从头开始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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM