我用c++写了一个websocket服务器,可以很好地使用websocket协议00(在握手头中有key1, key2)。
现在,随着新的更新,我正试图为新的握手工作方式做同样的事情。下面是我的服务器对握手请求的响应:
HTTP/1.1 101交换协议rnUpgrade: websocketrnConnection: UpgradernSec-WebSocket-Accept: "+ serverKey + "rnrn";
,其中serverkey计算正确。例如:
握手请求:
GET/test HTTP/1.1
升级:websocket
连接:升级
主持人:192.168.123.102:8585
Sec-WebSocket-Origin: http://192.168.123.5
Sec-WebSocket-Key: YB0mPvJ5t8ggCeGUWY39uQ = =
Sec-WebSocket-Version: 8
握手响应头:
HTTP/1.1 101交换协议
升级:websocket
连接:升级
Sec-WebSocket-Accept: xt9iyCNryQTseELUkHPWjzxA2ts =
我也用这里的例子https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-08检查了我的算法,它产生了完全相同的响应。
但是我仍然得到以下错误:
我使用chrome 15作为我的浏览器。
你知道哪里出了问题吗?
(也在chrome检查器网络中,它不显示响应,这是不接受握手的情况(即使是旧版本))
我实际上找到了主要问题。
我用于base64编码的密钥是
YB0mPvJ5t8ggCeGUWY39uQ==
258EAFA5-E914-47DA-95CA-C5AB0DC85B11
代替
YB0mPvJ5t8ggCeGUWY39uQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
一个额外的n是整个问题。
然而,现在我收到已连接的消息(ws客户端已成功连接到ws服务器),我不能发送或接收任何东西。问题出在服务器端。
你知道与旧的websocket协议相比服务器端有什么变化吗?
客户端发送数据时有不同的帧协议。以前是很简单的。现在情况复杂多了。请参考websockets rfc6455规范。
https://www.rfc-editor.org/rfc/rfc6455部分- 5.2