Apretón de manos de Python Websocket (RFC 6455)

Estoy tratando de implementar un servidor websoket simple en python, usando el protocolo RFC 6455. Tomé el formato de apretón de manos de aquí y aquí .

Estoy usando Chromium 17 y Firefox 11 como clientes, y obtengo este error:

Uncaught Error: INVALID_STATE_ERR: DOM Exception 11

Espero ver el hello from server en mi navegador y el hello from client en el registro del servidor.

Supongo que mi apretón de manos está mal, ¿puedes señalarme mi error?

Registro del servidor, solicitud:

 GET / HTTP/1.1 Upgrade: websocket Connection: Upgrade Host: 127.0.0.1:8999 Origin: null Sec-WebSocket-Key: 8rYWWxsBPEigeGKDRNOndg== Sec-WebSocket-Version: 13 

Registro del servidor, respuesta:

 HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: 3aDXXmPbE5e9i08zb9mygfPlCVw= 

Respuesta de cadena cruda:

 HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: 3aDXXmPbE5e9i08zb9mygfPlCVw=\r\n\r\n 

Código del servidor:

 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') 

Codigo del cliente:

    test   var s = new WebSocket('ws://127.0.0.1:8999'); s.onmessage = function(t){alert(t)}; s.send('hello from client');      

El código del protocolo de enlace de su servidor se ve bien.

Sin embargo, parece que el código del cliente intentará enviar un mensaje antes de que se complete el reconocimiento (asíncrono). Podría evitar esto moviendo su mensaje enviado al método de apertura de su websocket.

Una vez establecida la conexión, el servidor no envía ni recibe mensajes como texto sin formato. Consulte la sección de dataframe de la especificación para obtener más detalles. (El código del cliente puede ignorar esto ya que el navegador se encarga de la ttwig de los datos por usted).