Как я могу отправлять и получать сообщения WebSocket на стороне клиента? - PullRequest
1 голос
/ 18 января 2012
  • Как кодировать сообщения, отправляемые клиентом, в соответствии с последним протоколом WebSocket ?

  • Кажется, что проблема с кадрированием и маскировкой в ​​последней версии.Какой самый простой способ создания правильного кадрирования и маскирования на стороне клиента?

1 Ответ

1 голос
/ 31 января 2012

Если ваше сообщение меньше или равно 125 байтам, и если вы просто отправляете с клиента (и никогда не получаете), тогда вы можете использовать действительно тривиальный алгоритм.

Вот как вы бы это сделалисоздайте фрейм для отправки, используя python:

"\x81%c\x00\x00\x00\x00%s" % (128 + len(payload), payload)

Или, альтернативно, вот как вы могли бы сделать это в C:

#include <string.h>
#include <stdio.h>
...
char frame[131];
frame[0] = '\x81';
frame[1] = 128 + strlen(payload);
frame[2] = '\x00';
frame[3] = '\x00';
frame[4] = '\x00';
frame[5] = '\x00';
snprintf(frame+6, 125, "%s", payload);

Объяснение:

  • Первый байт 0x81 означает, что это последний (и единственный) кадр этого сообщения (т.е. без фрагментации).
  • Следующий байт - это маска и длина.Сообщения клиент-сервер должны быть замаскированы так, чтобы был установлен верхний бит.Если полезная нагрузка длиннее 125 байтов, то поле полезной нагрузки расширяет еще 2 или 8 байтов в заголовке.Поскольку это не так, это просто.
  • Поскольку маска является работающим XOR для полезной нагрузки, использование всех нулей для маски означает, что полезная нагрузка может быть отправлена ​​как есть (например, XOR с нулями не используется).).
  • Если ваше устройство будет работать произвольно ненадежно (например, Javascript в браузере), тогда вам следует использовать реальное случайное значение маски.Если это устройство Arduino, работающее под вашим собственным кодом, проблем не возникает, и вы можете использовать маску без опций (вам все равно нужно иметь маску в соответствии со спецификацией).

Если вы хотитеЧтобы выйти за рамки тривиального случая, я предлагаю взглянуть на диаграмму кадрирования в разделе 5 спецификации

...