2012-05-10 2 views
2

J'essaie de créer un serveur websocket de base, le serveur reçoit la prise de contact du client, mais il semble que le client n'ait pas accepté la prise de contact du serveur. J'ai aussi un doute sur la 'Sec-WebSocket-Key', je pense que la valeur hachée est trop longue! Merci :)HTML5 WebSocket Server

import socket 


def handle(s): 
    print repr(s.recv(4096)) 


s = socket.socket() 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) 
s.bind(('',9876)) 
s.listen(2) 

handshakes='\ 
HTTP/1.1 101 Web Socket Protocol Handshake\r\n\ 
Upgrade: WebSocket\r\n\ 
Connection: Upgrade\r\n\ 
WebSocket-Origin: null\r\n\ 
WebSocket-Location: ws://localhost:9876/\r\n\ 
' 
def handshake(hs): 
    hslist = hs.split('\r\n') 
    body = hs.split('\r\n\r\n')[1] 
    key = '' 
    cc = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' 

    for h in hslist: 
     if h.startswith('Sec-WebSocket-Key:'): 
      key = h[19:] 
     else: 
      continue 

    print key 

    import hashlib 
    import base64 
    s = hashlib.sha1() 
    s.update(key+cc) 
    h = s.hexdigest() 
    print 's = ', s 
    print 'h = ', h 
    return base64.b64encode(h) 

while True: 
    c,a = s.accept() 
    print c 
    print a 
    msg = c.recv(4096) 
    if(msg): 

     print msg 
     print 'sending handshake ...' 
     handshakes += 'Sec-WebSocket-Accept: '+str(handshake(msg))+'\r\n\r\n' 
     print handshakes 
     c.send(handshakes) 
      c.send('Hello !') 
      break; 

[edited]

Client:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Web Socket Example</title> 
    <meta charset="UTF-8"> 
    <script> 
     window.onload = function() { 
     var s = new WebSocket("ws://localhost:9876/"); 
     s.onopen = function(e) { alert("opened"); } 
     s.onclose = function(e) { alert("closed"); } 
     s.onmessage = function(e) { alert("got: " + e.data); } 
     }; 
    </script> 
    </head> 
    <body> 
     <div id="holder" style="width:600px; height:300px"></div> 
    </body> 
</html> 

sortie du serveur:

<socket._socketobject object at 0xb727bca4> 
('127.0.0.1', 46729) 
GET/HTTP/1.1 
Host: localhost:9876 
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:15.0) Gecko/15.0 Firefox/15.0a1 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive, Upgrade 
Sec-WebSocket-Version: 13 
Origin: null 
Sec-WebSocket-Key: wZG2EaSH+o/mL0Rr9Efocg== 
Pragma: no-cache 
Cache-Control: no-cache 
Upgrade: websocket 


sending handshake ... 
wZG2EaSH+o/mL0Rr9Efocg== 
s = <sha1 HASH object @ 0xb729d660> 
h = 49231840aae5a4d6e1488a4b34da39af372452a9 
HTTP/1.1 101 Web Socket Protocol Handshake 
Upgrade: WebSocket 
Connection: Upgrade 
WebSocket-Origin: null 
WebSocket-Location: ws://localhost:9876/ 
Sec-WebSocket-Accept: NDkyMzE4NDBhYWU1YTRkNmUxNDg4YTRiMzRkYTM5YWYzNzI0NTJhOQ== 


handshake sent 
+0

Pouvez-vous envoyer une copie d'un échantillon de demande de prise en charge plus la réponse de votre serveur s'il vous plaît? – simonc

+0

Avez-vous besoin d'utiliser str() sur les données renvoyées par handshake()? Je m'attendais à handshake() pour retourner une chaîne déjà. – simonc

+0

bonjour, j'ai édité le poste, en ajoutant la réponse du serveur et la source du code client – rednaks

Répondre

2

Je pense que vous devez appeler sha.digest() en place de hexdigest(). Vous voulez qu'un hachage binaire de 20 octets soit transmis à votre encodeur base64; digest() le fait tandis que hexdigest() convertit chacun de ces octets en une représentation hexadécimale de 2 octets. Pour plus de détails, reportez-vous au python sha docs.