我在 Firefox 4 上测试了你的代码,在点击发送时遇到了同样的错误,但在此之前我得到了
Firefox 无法建立连接
到服务器 ws://localhost:8888/。
这可能就是 WebSocket 对象被销毁的原因。我怀疑您的握手响应缺少某些内容,因此 Firefox 正在关闭套接字。
来自维基百科关于 Websockets 的文章:
Sec-WebSocket-Key1 和
Sec-WebSocket-Key2 字段和
字段后八个字节
服务器使用的随机令牌
最后构造一个16字节的token
的握手来证明它已经
读取客户的握手信息。
您的服务器的响应底部没有这个特殊的数字,所以我认为我们需要弄清楚如何生成它并包含它。
编辑:如何生成该数字
让我们从 key1、key2 和握手结束时的 8 个字节开始
key1 = "18x 6]8vM;54 *(5: { U1]8 z [ 8"
key2 = "1_ tx7X d < nw 334J702) 7]o}` 0"
end8 = "Tm[K T2u"
我们通过忽略不是数字 0-9 的每个字符来为每个键生成一个数字。在Python中:
def numFromKey(key):
return int(filter(lambda c: c in map(str,range(10)),key))
接下来,我们将该数字除以原始键字符串中的空格数,因此这是一个计算字符串中空格数的函数。
def spacesIn(key):
return len(filter(lambda c: c==' ',key))
由密钥产生的两个数字是:
pkey1 = numFromKey(key1)/spacesIn(key1)
pkey2 = numFromKey(key2)/spacesIn(key2)
现在我们需要连接 pkey1、pkey2 和 end8 的字节。处理后的密钥需要表示为 32 位 Big-Endian 数字。
from struct import pack
catstring = pack('>L',pkey1) + pack('>L',pkey2) + end8
然后我们采用这些字节的 md5 哈希值来获取我们在握手结束时添加的幻数
import md5
magic = md5.new(catstring).digest()
我认为至少是这样的