2015-06-08 194 views
0

我想知道如何响应在Python 3中的JavaScript websocket握手,我似乎无法弄清楚我应该如何在服务器端做出响应。我从我的客户端网页申请:Python服务器Websocket握手响应

GET/HTTP/1.1 
Host: localhost:8080 
Connection: Upgrade 
Pragma: no-cache 
Cache-Control: no-cache 
Upgrade: websocket 
Origin: http://www.w3schools.com 
Sec-WebSocket-Version: 13 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 
Sec-WebSocket-Key: euv7CmNNT22p59HbD3X7ww== 
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 

我可以告诉大家,我proably不会在意这个最,我只需要知道什么HTTP头和这样的发送,这样我可以设置此的WebSocket向上。谢谢!

回答

1

从Python2代码在这里转换:https://gist.github.com/jkp/3136208

这里是服务器端代码Python3来验证客户端浏览器&返回它的握手确认:

MAGIC = b'258EAFA5-E914-47DA-95CA-C5AB0DC85B11' # Fix key for handshake on server side 
class WebSocketsHandler(socketserver.StreamRequestHandler): 
    def handshake(self): 
     data = self.request.recv(1024).strip() 
     hsKey = hsUpgrade = b'' 
     for header in data.split(b'\r\n'): 
     if header.startswith(b'Sec-WebSocket-Key'): hsKey = header.split(b':')[1].strip() 
     if header.startswith(b'Upgrade'): hsUpgrade = header.split(b':')[1].strip() 
     if hsUpgrade != b"websocket": return 
     digest = b64encode(bytes.fromhex(sha1(hsKey + MAGIC).hexdigest())).decode('utf-8') 
     response = ('HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\n' 
      'Connection: Upgrade\r\nSec-WebSocket-Accept: {}\r\n\r\n'.format(digest)) 
     print('Handshaking...{}'.format(digest)) 
     self.handshake_done = self.request.send(response.encode('utf8'))