Python websocket server - отправка сообщения - PullRequest
0 голосов
/ 10 июля 2020

Я пишу свой собственный сервер и клиентов websocket. Я успешно обработал рукопожатие и установил соединение.

Теперь я пишу функцию send_message, которая создает подходящий кадр. Пример ниже предназначен только для цели этого вопроса, это не то, что я, наконец, собираюсь написать, и это всего лишь один из многих способов, которые я пробовал дать мне тот же следующий результат.

def send_message(client_socket: socket.socket, message: str):
    length = len(message)
    opcode = 0x1
    fin, rsv1, rsv2, rsv3, opcode = 1, 0, 0, 0, opcode
    first_byte = chr(fin << 7 | rsv1 << 6 | rsv2 << 5 | rsv3 << 4 | opcode)
    if length < 126:
        mask = 0
        second_byte = chr(mask << 7 | length)
        first_byte += second_byte
        first_byte = six.b(first_byte)
    payload = first_byte + message.encode("utf-8")

    return client_socket.send(payload)

Для ввода: Ok from server вышеуказанная функция должна отправить b'\x81\x0eOk from server'

Первый байт \x81 - 10000001

первый бит установлен в 1 - FIN, означает, что это последний кадр сообщение

второй, третий и четвертый - все нули, для этого примера не имеет значения

следующие четыре бита - opcode 0001, означает, что сообщение имеет текст

Проблема c Второй байт \x0e он должен быть 00001110 первый бит установлен в 0 - mask, если установлен в 1, полезная нагрузка маскируется, в моем случае ДОЛЖЕН быть установлен равным 0, все сообщения от сервера к клиенту НЕ ДОЛЖНЫ маскироваться

следующие 7 бит - длина полезной нагрузки, в случае Ok from server = 14

Осталась полезная нагрузка.

Теперь, когда я отправляю это javascript клиенту в chrome, я получаю: WebSocket connection to 'ws://localhost:8002/' failed: A server must not mask any frames that it sends to the client.

Я скопировал код из нескольких примеров (веб-сокеты, SimpleWebsocketServer и т. д. c.), все дают мне одно и то же b'\x81\x0eOk from server'

Вопрос №1 Что я делаю не так?

Вопрос №2 Как отлаживать веб-сокеты? В chrome devtools больше нет вкладки «фреймы» для проверки веб-сокетов, поэтому не видно фактических полученных байтов. Пробовал Wireshark, но явно декодирование функций фреймов веб-сокетов отсутствовало в нем в течение многих лет.

Edit

Функция создает правильную полезную нагрузку, проблема где-то в другом месте, возможно сокет настройки.

1 Ответ

0 голосов
/ 14 июля 2020

Первоначальное рукопожатие имело \n\r вместо \r\n. Все клиенты все равно установили соединения, но при анализе следующих сообщений они получали бы один дополнительный байт, создавая искаженные кадры, вызывающие ошибку.

...