与 'ws://localhost:2017/' 的 WebSocket 连接失败:无效的帧头

WebSocket connection to 'ws://localhost:2017/' failed: Invalid frame header

我正在尝试使用 c# 创建一个异步 websocket 服务器。

在网上搜索了很多之后,我已经握手完成了。
但是在握手之后,我似乎无法以字节数组格式发送任何数据:(

这是我用来将 byte[] 数据发送到已接受和连接的套接字的代码(我检查了两者!)

socket.Send(Encoding.Default.GetBytes("Hello"));
//socket is a System.Net.Sockets.Socket object.

如果我尝试这样做,我会在客户端得到这个(我使用一个名为 "Simple Web Socket Client" 的 chrome 扩展):

index.js:15 WebSocket connection to 'ws://localhost:2017/' failed: Invalid frame header  
CLOSED: ws://localhost:2017

(没错2017就是端口),但是为什么说Invalid frame

好的,我知道 "hello" 字符串上没有帧头,但我似乎无法在互联网上的任何地方找到合适的头 :( 是的,我搜索了所有我get 是一个关于 RTC 的非常混乱的规范!

这里有人知道我做错了什么吗?

如您在this article or in the webSocket specification itself中所见,webSocket协议以特定的数据帧格式交换数据。您不只是将字节写入普通套接字。

以下是帧格式的示例:

 0               1               2               3              
 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 4               5               6               7              
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|     Extended payload length continued, if payload len == 127  |
+ - - - - - - - - - - - - - - - +-------------------------------+
 8               9               10              11             
+ - - - - - - - - - - - - - - - +-------------------------------+
|                               |Masking-key, if MASK set to 1  |
+-------------------------------+-------------------------------+
 12              13              14              15
+-------------------------------+-------------------------------+
| Masking-key (continued)       |          Payload Data         |
+-------------------------------- - - - - - - - - - - - - - - - +
:                     Payload Data continued ...                :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                     Payload Data continued ...                |
+---------------------------------------------------------------+

您必须以这种格式放置您的数据,并且您还必须使用基于之前交换的安全凭证的安全方案。 webSocket 不是普通套接字。您必须使用 webSocket 协议。

仅供参考,我的人不会从头开始实现 webSocket 端点,而是选择一个以您选择的语言编写的库,它可以为您完成所有工作。然后,您只需发送字节,库就会为您处理协议工作。

我也遇到了同样的问题。通过安装 socket.io at client side 解决。它可能对你也有用。