带有 Python 的 HTML5 套接字

Posted

技术标签:

【中文标题】带有 Python 的 HTML5 套接字【英文标题】:HTML5 Sockets with Python 【发布时间】:2013-05-23 20:14:05 【问题描述】:

试图找出我在这里做错了什么。我不断收到此错误“失败:WebSocket 握手期间出错:Sec-WebSocket-Accept 不匹配”。

以下是我从服务器得到的:

GET /?encoding=text HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:8026
Origin: http://www.websocket.org
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: en04jzbfLcwcFhk5qnUxJg==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/27.0.1453.93 Safari/537.36

我使用“en04jzbfLcwcFhk5qnUxJg==”并添加“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”以获得以下信息:

en04jzbfLcwcFhk5qnUxJg==258EAFA5-E914-47DA-95CA-C5AB0DC85B11

所以我的回答是:

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

我不确定我做错了什么,但从我在其他示例中看到的情况来看,我的 websocket 接受密钥似乎相当长。

以下是我的代码,任何想法都会有所帮助。

#!/usr/bin/env python

import socket
import thread
import hashlib
import base64
import binascii

def handshake(conn):
    request = conn.recv(1024).strip()
    print request

    specificationGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
    websocketKey = ''

    lines = request.splitlines()
    for line in lines:
            args = line.partition(": ")
            if args[0] == 'Sec-WebSocket-Key':
                    websocketKey = args[2]
    print websocketKey

    fullKey = hashlib.sha1(websocketKey + specificationGUID).hexdigest()
    acceptKey = base64.b64encode(fullKey)

    response = 'HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: ' + acceptKey + '\r\n\r\n'
    conn.send(response)
    print response

def accept(conn):
    def threaded():
        while True:
            handshake(conn)

thread.start_new_thread(threaded, ())

if __name__ == "__main__":
    HOST, PORT = 'localhost', 8026
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((HOST, PORT))
    server.listen(5)

    print "Listening on %s" % ("%s:%s" % server.getsockname())

    while 1:
            conn, addr = server.accept()
            accept(conn)

【问题讨论】:

我发现了问题,我使用了 .hexdigest() 而不是只使用 .digest()。改变了,连接成功了。 回答你的问题,给自己加分! 【参考方案1】:

我发现了问题,我使用了 .hexdigest() 而不是只使用 .digest()。改了,连接成功了。

【讨论】:

以上是关于带有 Python 的 HTML5 套接字的主要内容,如果未能解决你的问题,请参考以下文章

带有线程池服务器python的套接字

带有 Python SSL 套接字的自签名证书

带有 Java 客户端和 Python 服务器的数据报套接字

如何在html5中断开连接后重新连接到套接字

http 服务器将如何处理 html5 网络套接字?

Java SSLSocket 和 HTML5 之间的通信