如何在客户端发送和接收 WebSocket 消息?

发布于 2024-12-27 22:22:41 字数 291 浏览 0 评论 0原文

  • 如何对从客户端发送的消息进行编码以符合最新的 WebSocket 协议< /a>?

  • 成帧和屏蔽似乎是最新版本的问题。生成正确的框架和屏蔽客户端的最简单方法是什么?

  • How do I encode messages to be sent from the client to comply with the latest WebSocket Protocol?

  • Framing and masking seem to be the issue with the latest version. What is the easiest way to generate correct framing and masking client side?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦纸 2025-01-03 22:22:41

如果您的消息全部小于或等于 125 字节,并且您只是从客户端发送(并且从不接收),那么您可以使用非常简单的算法。

以下是如何使用 python 构建要发送的帧:

"\x81%c\x00\x00\x00\x00%s" % (128 + len(payload), payload)

或者,以下是如何在 C 中执行此操作:

#include <string.h>
#include <stdio.h>
...
char frame[131];
frame[0] = '\x81';
frame[1] = 128 + strlen(payload);
frame[2] = '\x00';
frame[3] = '\x00';
frame[4] = '\x00';
frame[5] = '\x00';
snprintf(frame+6, 125, "%s", payload);

说明:

  • 第一个字节 0x81 意味着这是最终的(也是唯一的)帧该消息的内容(即没有碎片)。
  • 下一个字节是掩码和长度。客户端到服务器的消息必须被屏蔽,以便设置最高位。如果有效负载长于 125 个字节,则有效负载字段会在标头中另外扩展 2 或 8 个字节。既然不是,那就很容易了。
  • 由于掩码是在有效负载上运行的异或,因此对掩码使用全零意味着可以按原样发送有效负载(例如,与零进行异或运算是无操作)。
  • 如果您的设备要运行任意不受信任的设备(例如浏览器中的 Javascript),那么您应该使用真正的随机掩码值。如果这是运行您自己的代码的 Arduino 设备,那么就没有问题,您可以使用无操作掩码(根据规范,您仍然需要有一个掩码)。

如果您想超越简单的情况,我建议您查看 部分中的框架图5 规范

If your message are all less than or equal to 125 bytes, and if you are just sending from the client (and never receiving) then you can use a really trivial algorithm.

Here is how you would construct a frame to send using python:

"\x81%c\x00\x00\x00\x00%s" % (128 + len(payload), payload)

Or alternately, here is how you could do it in C:

#include <string.h>
#include <stdio.h>
...
char frame[131];
frame[0] = '\x81';
frame[1] = 128 + strlen(payload);
frame[2] = '\x00';
frame[3] = '\x00';
frame[4] = '\x00';
frame[5] = '\x00';
snprintf(frame+6, 125, "%s", payload);

Explanation:

  • The first byte 0x81 means that this is the final (and only) frame of this message (i.e. no fragmentation).
  • The next byte is the mask and the length. Client to server messages must be masked so the top bit is set. If the payload is longer than 125 bytes then the payload field extends another 2 or 8 bytes in the header. Since it's not, it's easy.
  • Since the mask is a running XOR on payload, using all zeros for the mask means that the payload can be send as is (e.g. XOR'ing with zeros is a no-op).
  • If you device is going to run arbitrary untrusted then (e.g. Javascript in a browser) then you should use a real random mask value. If this is an Arduino device running your own code then there is no issue and you can use a no-op mask (you still have to have a mask according to the spec).

If you want to go beyond the trivial case I suggest looking at the framing diagram in section 5 of the spec

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文