3

我正在查看创建“Hello World”WebSocket 示例并开始尝试对其进行调整以通过在控制台输入的 WebSocket 发送自定义消息,但我在理解代码时遇到了一些问题。

我的问题是对我自己的消息进行编码以便可以根据我上面链接的答案正确发送的正确方法是什么

client.Send(my-own-message);
4

2 回答 2

1

所以首先Console.Read()只读取一个字符并返回代表这个字符的 int。

如果您想发送一条消息,您可能希望使用Console.ReadLine()它返回一个字符串。

string msg = Console.ReadLine();
client.Send(GetBytes(msg));

static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

如果包含仪表:

byte[] ascii = System.Text.Encoding.ASCII.GetBytes (msg);
byte[] utf8 = System.Text.Encoding.UTF8.GetBytes (msg);
于 2012-11-24T12:05:51.847 回答
1

你真的应该去源头。Websocket 规范实际上非常易于阅读,它准确地告诉您应该如何格式化您的消息。

但简而言之,假设您已经完成了建立连接的初始握手,以下是 Websocket 框架应包含的数据:

  • 0x81一个操作码,如果消息被格式化为 UTF-8 文本,并且0x82消息是二进制数据(请注意,一些浏览器不支持后者) ,则为带有值的单个字节
  • 一个或多个字节的长度字段,描述消息的长度。必须在客户端发送的消息上设置第一个字节的最高有效位(它表示有效负载被屏蔽,必须在客户端到服务器的消息上进行,并且不能在服务器到客户端的消息上进行)。长度字段可以具有可变长度:如果长度低于 126 字节,则将其简单地编码为单个字节(保留最高有效位以指示屏蔽,如前所述)。如果长度小于 65KB,则第一个字节的 7 个可用位取值 126,随后两个字节包含长度为 16 位整数。否则,第一个字节的 7 位取值 127,随后的 8 个字节包含长度为 64 位整数。
  • 一个 4 字节的掩码密钥,必须为每条消息随机选择
  • 最后,您要发送的实际消息。这必须使用掩码键进行掩码,只需将每个字节与掩码键的一个字节进行异或运算即可。(i消息的字节应该与i%4掩码键的第 th 字节一起异或)。

这样做,您就创建了一个有效的 websocket 框架,其中包含 UTF8 文本或原始二进制数据。如您所见,其中涉及几个步骤,但每个步骤都相对简单。(再一次,请检查我链接到的 RFC,因为我只是从内存中写了所有这些,所以可能会有一些不准确的地方)

于 2012-11-24T12:53:58.327 回答