我正在尝试使用hixie-76草案在Delphi6上构建一个websocket服务器,我遇到了握手问题。
当我尝试使用这三个部分时,我得到的md5指纹似乎不正确,但是当我使用与protocole规范中给出的例子相同的algorythm时,我得到了良好的md5响应......
我正在这样处理,将key1中找到的数字除以32位字中的空格数,与key2相同,最后添加最后8个字节(key3)以获得我使用的128位字符串作为md5入口。
使用155712099,173347027用于key1和key2和'Tm [K T2u'用于key3,我得到正确的md5指纹,所以我不明白为什么这个算法不会给客户端正确的指纹
这是我收到的例子:
GET / HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: localhost:8018
Origin: null
Sec-WebSocket-Key1: 4 102(2 6U 2 3 18
Sec-WebSocket-Key2: 69V86`6t)e 0 2 42
M]Rzÿõ&
和我给出的握手
HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: null
Sec-WebSocket-Location: ws://localhost:8018/
µ&Mq˜8èõÙZÙ,hœi
Maybye我的回复还有另一个问题,但似乎我的md5指纹有问题。
有谁看到我的错误在哪里?
提前感谢您的帮助
更新
我已经看过这个单位,但除非我非常擅长阅读,否则这个类的握手部分不计算任何md5总和,我认为它使用旧版本的协议而不是当前(76)
当我查看以下代码时,我看到答案是在没有任何md5响应的情况下编写的。
`试试 //读取请求标头 HandshakeRequest:= TWebSocketRequest.Create(ServerConnection);
// Send response headers
ServerConnection.WriteLn('HTTP/1.1 101 Web Socket Protocol Handshake');
ServerConnection.WriteLn('Upgrade: WebSocket');
ServerConnection.WriteLn('Connection: Upgrade');
ServerConnection.WriteLn('WebSocket-Origin: ' + HandshakeRequest.Origin);
ServerConnection.WriteLn('WebSocket-Location: ws://' + HandshakeRequest.Host + '/');
// End handshake
ServerConnection.WriteLn;
ServerConnection.WriteLn;
HandshakeResponseSent := True;
除 在E:TWebSocketHandshakeException上 开始 //如果握手失败,请关闭连接 ServerConnection.Disconnect; 结束;`
再次感谢
更新2011 04 14
我终于找到问题所在......
我正在建立我的回答:
resp := [...] +'Sec-WebSocket-Origin: '+ origin + #13#10 +
所以在md5指纹之前有3 0x0D 0x0A而不是2 ...
#13#10#13#10 +
md5response;
由于我无法回答我自己的问题,我将无法将其标记为解决,但确实如此! :)
答案 0 :(得分:1)
Delphi的谷歌代码中存在一个websocket类,它可能会给你答案:
http://code.google.com/p/delphiws/source/browse/trunk/source/uWebSocket.pas?r=4