当前位置: 首页 > 知识库问答 >
问题:

HTML5套接字与Python

谷梁子濯
2023-03-14

试着找出我做错了什么。我一直收到这样的错误:“失败:WebSocket握手期间出错:Sec WebSocket接受不匹配”。

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

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

我采用了“EN04JZBFLCFCHK5QNUXJG==”并添加了“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 accept键似乎相当长。

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

#!/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)

共有1个答案

韩烈
2023-03-14

我发现了问题,我用了。hexdigest()而不仅仅是使用。摘要()。更改后,连接成功。

 类似资料:
  • 问题内容: 我试图理解SocketChannels和NIO。我知道如何使用常规套接字,以及如何制作一个简单的每客户端线程服务器(使用常规阻塞套接字)。 所以我的问题是: 什么是SocketChannel? 当使用SocketChannel而不是Socket时,我还能得到什么呢? 通道和缓冲区之间是什么关系? 什么是选择器? 文档中的第一句话是。那是什么意思? 我也阅读了本文档,但是不知何故…… 问

  • 你好,我想问一下使用这个有什么不同: 谢谢你的回答

  • 我有一个UDP服务器,它必须同时为IPV4和IPV6地址上的客户端提供服务。我创建了一个IPV6套接字来同时为IPV4和IPV6客户端服务。 服务器在第一次通信时存储客户端的IPAddress。如果是IPV4客户端,则存储为IPV4地址;如果是IPV6客户端,则服务器存储为IPV6地址。对于以后的所有通信,它检查存储是否已知(存储)该客户端,然后相应地执行操作。为了将客户端地址与存储的地址进行比较

  • 问题内容: 为什么有人会喜欢阻止写而不是非阻止写?我的理解是,仅当您想确保写方法返回后,另一端获得了TCP数据包时,才希望阻止写操作,但是我什至不知道这是可能的。您将必须刷新,而刷新则必须刷新 底层操作系统的写套接字缓冲区 。那么,无阻塞套接字写是否有任何缺点?就性能而言,拥有较大的底层写套接字是否会缓冲一个不好的主意?我的理解是,底层套接字写缓冲区越小,当底层套接字缓冲区已满且isWritabl

  • socket_read和socket_recv之间有什么区别?我正在尝试使用PHP套接字,但使用socket_read时收到了以下警告: 请帮帮我!

  • 我最近一直在玩套接字,但是我遇到了一个问题…当我从服务器接收数据时,我得到一个“java.net.套接字异常:套接字关闭”异常。我没有在任何地方关闭套接字,事实上,我唯一使用关闭()的地方是扫描仪上从System.in读取文本; 以下是我的代码: 客户: 服务器: 数据包发送者: 客户端接收器: 数据包接收器: