我试图在Delphi6上使用hixie-76草案建立一个websocket服务器,我有一个握手的问题。
当我尝试它时,我与三个部分获得的md5指纹似乎不正确,但是当我使用协议规范中给出的示例相同的算法时,我得到了良好的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
也许我的回答有另一个问题,但我的md5指纹似乎真的有问题。
有没有人看到我的错误在哪里??
提前感谢您的帮助
我看过这个单元,但除非我阅读能力很差,否则这个类的握手部分不计算任何md5和,我认为它使用的是旧版本的协议,而不是当前的(76)
当我查看下面的代码时,我看到答案是没有任何md5响应的。
的尝试//读取请求头handshakerrequest:= twebsocketrerequest . 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;结束,"
再次表示感谢Update 2011 04 14
我终于找到问题在哪里了…
我是这样构建我的响应的:
resp := [...] +'Sec-WebSocket-Origin: '+ origin + #13#10 +
所以在md5指纹之前有3个0x0D 0x0A而不是2…
#13#10#13#10 +
md5response;
因为我不能回答我自己的问题,我将无法标记它解决,但它是!:)
在Delphi的google代码中存在一个websocket类,它可能会给你答案:
http://code.google.com/p/delphiws/source/browse/trunk/source/uWebSocket.pas?r=4