Я пишу свой собственный сервер и клиентов 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
Функция создает правильную полезную нагрузку, проблема где-то в другом месте, возможно сокет настройки.