通过C#Socket发送WebSocket消息

时间:2012-11-24 11:09:04

标签: c# sockets websocket

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

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

client.Send(my-own-message);

2 个答案:

答案 0 :(得分:1)

首先,Console.Read()只读取一个char并返回表示此char的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;
}

如果包围了metters:

byte[] ascii = System.Text.Encoding.ASCII.GetBytes (msg);
byte[] utf8 = System.Text.Encoding.UTF8.GetBytes (msg);

答案 1 :(得分:1)

你应该go to the source。 Websocket规范实际上非常简单易读,它可以准确地告诉您消息的格式化。

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

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

执行此操作,您已创建包含UTF8文本或原始二进制数据的有效websocket框架。如您所见,涉及几个步骤,但每个步骤都相对简单。 (再次,请检查我链接到的RFC,因为我刚刚从内存中写了所有这些,因此可能存在轻微的不准确性)