Кодирование данных в новом протоколе рукопожатия hybi-10 - PullRequest
0 голосов
/ 20 сентября 2011

Я использую WebSocket для Python и JavaScriptand и до сих пор протоколом рукопожатия для Google Chrome было draft hybi-00 . Я думаю, что Google Chrome недавно изменил протокол на draft hybi-10 .

Итак, сегодня я обновил код подтверждения, и теперь WebSocket успешно создан и открыт. На событие onopen в JavaScript я отправляю простое текстовое сообщение:

viz.ws = new WebSocket("ws://127.0.0.1:5500");

viz.ws.onopen = function() {
    viz.ws.send("TEST\n");
};

Мой сервер в Python получает эти данные. Тем не менее, это как-то закодировано, и я не могу получить простой текст "TEST\n" Я отправил:

    def recv_data(self, client, count):

        try:
            data = client.recv(count)

        except:
            return False

        print data
        print data.decode('utf-8','ignore')

        return data.decode('utf-8', 'ignore')

Отпечатки возвращают это:

üàÍu┬¯é0æ║▄
u0

И они всегда разные, но отправленный текст всегда TEST\n.

Кроме того, сервер получает эти данные, но клиент не получает никаких данных, отправленных с сервера.

Я читал, что hybi-10 использует двоичные файлы ... Я пропускаю преобразование данных в этом коде? Извините, я действительно новичок в WebSockets, и эти протоколы портят мне голову ...

1 Ответ

1 голос
/ 20 сентября 2011

Способ формирования данных в HyBi (HyBi-00 - это действительно Hixie-76) значительно изменился. Новый формат кадра описан в этой диаграмме .

Кроме того, для данных, которые отправляются с клиента на сервер, данные маскируются . Маска представляет собой первые 4 байта полезной нагрузки кадра и декодируется (и фактически кодируется) на месте с использованием этого простого алгоритма:

data[i] = data[i] XOR mask[j MOD 4]

Ключ маски различен для каждого кадра, поэтому вы каждый раз получаете различную полезную нагрузку, даже если отправляете одни и те же данные.

Если клиент не получает отправленные вами данные, есть вероятность, что вы неправильно оформляете данные. Также обратите внимание, что Chrome 14 и Firefox 6/7 еще не поддерживают двоичные данные, поэтому для обозначения текстового (UTF-8) фрейма должен быть код операции 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...