2013-08-16 2 views
1

как я могу определить длину полезной нагрузки сообщения html5 над websockets?как выработать размер полезной нагрузки от html5 websocket

Im известно, что базовый протокол состоит из кода op, тогда длина определяется следующими 1 - 8 байтами, тогда следующие значения - хеширование, а затем остальное - полезная нагрузка!

Я создаю приложение для Java-сервера, которое получит сообщение от клиента html5, а затем обработает, iI может обрабатывать сообщения до 256 байтов.

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

Приветствие

+0

Кто-нибудь? Пожалуйста .. –

ответ

4

Есть три способа, как длина полезной нагрузки WebSocket кадра может быть закодирован, которые зависят от длины полезной нагрузки:

  1. 125 или менее
  2. 126-65535
  3. 65536 +

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

Когда он находится ниже 126, это длина полезной нагрузки. Когда это 126, длина полезной нагрузки находится в следующих двух байтах. Когда это 127, длина полезной нагрузки находится в следующих 8 байтах.

Так алгоритм вы должны следовать, чтобы интерпретировать WebSocket кадр является:

  1. чтения 1-й байт (»byte0„), чтобы получить флаг плавник и опкод
  2. чтения 2-й байт (“ byte1 «)
  3. когда byte1 больше 127, вычесть 127 из byte1 и установите masked в true
  4. когда byte1 сейчас 126, прочитайте следующие два байта и преобразуйте их в short. Это payload_length.
  5. , когда byte1 - 127, прочитайте следующие восемь байтов и преобразуйте их в long. Это payload_length.
  6. когда byte1 что-то еще, payload_length равно значению byte1
  7. когда masked верно, прочтите следующие 4 байта. Это masking_key.
  8. прочитайте количество байтов, которое у вас есть в payload_length, чтобы получить полезную нагрузку.
  9. , когда masked истинно, примените masking_key к полезной нагрузке.

В раме websocket нет хеш-кода, вы должны что-то смешать. Целостность кадра websocket обеспечивается уровнем TCP под ним.

Дополнительную информацию о протоколе Websocket см. В разделе RFC 6455.

+0

Да, извините, это был ключ маскировки, а не хеширование. –

+0

@OwainFormby Когда мой ответ вам поможет, пожалуйста, примите его (значок рядом с ним). Когда это не понравится, скажите мне, что вы не понимаете. – Philipp

+0

Не знаете, как Java обрабатывает структуры данных, но стоит отметить, что это ** BIG endian **, с которым вы работаете. Поэтому, читая 2 или 8 байтов, которые указывают длину полезной нагрузки, вы должны ее переустановить как большой эндиан. Иначе вы ввернуты. – Torxed