2012-05-10 5 views
2

Я пытаюсь создать базовый сервер веб-сервера, сервер получает рукопожатие с клиентом, но, похоже, клиент не принял квитирование ответа на сервер. У меня также есть сомнения относительно «Sec-WebSocket-Key», я думаю, что хеш-значение слишком длинное! Спасибо :)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; 

[Изменено]

Клиент:

<!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> 

выход Сервер:

<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

Можете ли вы отправить копию примерного подтверждения квитанции плюс ответ вашего сервера, пожалуйста? – simonc

+0

Нужно ли использовать str() для данных, возвращенных из рукопожатия()? Я бы ожидал, что рукопожатие() вернет строку уже. – simonc

+0

привет, я редактировал сообщение, добавляя ответ сервера и код клиентского кода – rednaks

ответ

2

Я думаю, вам нужно позвонить sha.digest() вместо hexdigest(). Вы хотите, чтобы 20-байтовый двоичный хеш передавался в ваш кодер base64; digest() делает это в то время как hexdigest() преобразует каждый из этих байтов в 2-байтовое шестнадцатеричное представление.

Подробнее см. В python sha docs.