Я протестировал ваш код в Firefox 4 и получил ту же ошибку при нажатии send, однако до этого я получил
Firefox не может установить соединение с сервером по адресу ws: // localhost:8888 /.
, вероятно, поэтому объект WebSocket был уничтожен.Я подозреваю, что в вашем ответе на рукопожатие что-то отсутствует, поэтому Firefox закрывает сокет.
Из статьи Википедии о Websockets:
Sec-WebSocket-Key1 и Sec-WebSocket-Key2поля и восемь байтов после полей являются случайными токенами, которые сервер использует для создания 16-байтового токена в конце своего рукопожатия, чтобы доказать, что он прочитал рукопожатие клиента.
Ответ вашего сервера делаетне иметь этого специального числа внизу, поэтому я думаю, что нам нужно выяснить, как его сгенерировать, и включить его.
РЕДАКТИРОВАТЬ: Как сгенерировать это число
Давайте начнем с ключа 1, ключа 2 и 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-битных чисел с прямым порядком байтов.
from struct import pack
catstring = pack('>L',pkey1) + pack('>L',pkey2) + end8
Затем мы берем md5-хеш этих байтов, чтобы получить магическое число, которое мы добавляем в конце рукопожатия
import md5
magic = md5.new(catstring).digest()
Вот как я думаю, это работает по крайней мере