【问题标题】:Sending WebSocket message over C# Socket通过 C# Socket 发送 WebSocket 消息
【发布时间】:2023-03-15 12:10:01
【问题描述】:

我正在查看 Create "Hello World" WebSocket example 并开始尝试调整它以通过在控制台中输入的 WebSocket 发送自定义消息,但我在理解代码时遇到了一些问题。

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

client.Send(my-own-message);

【问题讨论】:

  • 从我能从你的问题中得到的一点信息,我猜你之前对套接字编程的经验很少甚至没有。我建议你先吃一小块,然后再开始使用基本的 TCP 套接字。
  • 是的,我对套接字编程的经验很少。不幸的是,这是我需要尝试完成的事情。我本来希望从较小的开始,但时间限制阻碍了我做这个。
  • @Meekel 你想发送什么?您是否尝试将数据发送到网络?你的客户是哪个班级?
  • @Danpe 我只是想发送一点 JavaScript,然后在 JS 中的 onmessage 中对其进行评估。我看过一个名为 Waldo 的例子,它是基于 websocketpp 构建的,它做了同样的事情。
  • 哇哦,你到底在问什么?这是一个关于如何使用现有的 websocket 实现来发送消息的问题,或者如何根据 websocket 规范格式化数据,或者如何从标准输入流中读取数据,或者其他任何东西?请尝试将您的问题缩小到一件事,并告诉我们相关背景,仅此而已。如果您能够从控制台获取字符串,则删除代码的“getting-string-from-console”部分,然后向我们展示您如何处理生成的字符串,例如

标签: c# sockets websocket


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢 jalf 的帮助! :)
【解决方案2】:

所以首先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);

【讨论】:

  • 我相信问题在于使消息符合 websocket 协议。因此,它不仅仅是复制数据,而是添加正确的标头并屏蔽有效负载等,以便它可以通过 TCP 套接字发送,并由 websocket 服务器接收。 :)
猜你喜欢
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2017-06-25
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多