我在看 Create "Hello World" WebSocket example并开始尝试调整它以通过在控制台输入的 WebSocket 发送自定义消息,但我在理解代码时遇到了一些问题。
我的问题是什么是对我自己的消息进行编码的正确方法,以便它可以根据我上面链接的答案正确发送
client.Send(my-own-message);
最佳答案
你真的应该go to the source . Websocket 规范实际上非常易于阅读,它告诉您应该如何格式化消息。
但简而言之,假设您已经完成了建立连接的初始握手,以下是 Websocket 框架应包含的数据:
- 一个操作码,如果消息的格式为 UTF-8 文本,则值为
0x81
的单个字节,如果消息为二进制数据,则为0x82
(请注意,一些浏览器不支持后者) - 一个或多个字节的长度字段,描述消息的长度。第一个字节的最高有效位必须在客户端发送的消息上设置(它表示负载被屏蔽,这必须在客户端到服务器的消息上完成,并且必须不完成在服务器到客户端的消息上)。长度字段可以具有可变长度:如果长度低于 126 字节,则将其简单地编码为单个字节(保留最高有效位以指示屏蔽,如前所述)。如果长度小于 65KB,则第一个字节的 7 个可用位取值 126,随后的两个字节将长度作为 16 位整数包含。否则,第一个字节的7位取值127,随后的8个字节包含64位整数的长度。
- 一个 4 字节的掩码 key ,必须为每条消息随机选择
- 最后,您要发送的实际消息。这必须使用掩蔽键来掩蔽,只需将每个字节与掩蔽键的一个字节进行异或运算即可。 (消息的字节
i
应该与屏蔽 key 的第i%4
字节一起进行异或)。
这样做,您就创建了一个有效的 websocket 框架,其中包含 UTF8 文本或原始二进制数据。如您所见,其中涉及几个步骤,但每个步骤都相对简单。 (再一次,请检查我链接到的 RFC,因为我只是凭内存写下所有这些,所以可能会有一些小的错误)
关于c# - 通过 C# Socket 发送 WebSocket 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13540621/