我想用delphi6进行websocket握手

时间:2011-04-07 15:45:13

标签: delphi md5 websocket delphi-6 handshake

我正在尝试使用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 +
#13#10#13#10 +
md5response;
所以在md5指纹之前有3 0x0D 0x0A而不是2 ...

由于我无法回答我自己的问题,我将无法将其标记为解决,但确实如此! :)

1 个答案:

答案 0 :(得分:1)

Delphi的谷歌代码中存在一个websocket类,它可能会给你答案:

http://code.google.com/p/delphiws/source/browse/trunk/source/uWebSocket.pas?r=4