handshake python websocket (RFC 6455)
Usiłuję zaimplementować prosty serwer websoket na Pythonie, używając protokołu RFC 6455. Wziąłem format uścisku dłonitutaj itutaj.
Używam Chromium 17 i Firefox 11 jako klientów i otrzymuję ten błąd:
Uncaught Error: INVALID_STATE_ERR: DOM Exception 11
Spodziewam się zobaczyćhello from server
w mojej przeglądarce ihello from client
w dzienniku serwera.
Myślę, że mój uścisk dłoni jest zły, możesz mi wskazać mój błąd?
Dziennik serwera, żądanie:<code>GET / HTTP/1.1 Upgrade: websocket Connection: Upgrade Host: 127.0.0.1:8999 Origin: null Sec-WebSocket-Key: 8rYWWxsBPEigeGKDRNOndg== Sec-WebSocket-Version: 13 </code>Dziennik serwera, odpowiedź:
<code>HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: 3aDXXmPbE5e9i08zb9mygfPlCVw= </code>Odpowiedź na ciąg surowy:
<code>HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: 3aDXXmPbE5e9i08zb9mygfPlCVw=\r\n\r\n </code>Kod serwera:
<code>import socket import re from base64 import b64encode from hashlib import sha1 websocket_answer = ( 'HTTP/1.1 101 Switching Protocols', 'Upgrade: websocket', 'Connection: Upgrade', 'Sec-WebSocket-Accept: {key}\r\n\r\n', ) GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('127.0.0.1', 8999)) s.listen(1) client, address = s.accept() text = client.recv(1024) print text key = (re.search('Sec-WebSocket-Key:\s+(.*?)[\n\r]+', text) .groups()[0] .strip()) response_key = b64encode(sha1(key + GUID).digest()) response = '\r\n'.join(websocket_answer).format(key=response_key) print response client.send(response) print client.recv(1024) client.send('hello from server') </code>Kod klienta:
<code><!DOCTYPE html> <html> <head> <title>test</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script type="text/javascript"> var s = new WebSocket('ws://127.0.0.1:8999'); s.onmessage = function(t){alert(t)}; s.send('hello from client'); </script> </head> <body> </body> </html> </code>