У меня есть байт-массив, состоящий из данных, полученных от WebSocket-клиента.Данные, которые у меня есть, могут быть либо 1 приемными, либо буферизованными данными + последний прием.Это зависит от погоды или от того, были ли буферизованы какие-либо данные.
Теперь, на самом деле, есть 3 возможных вещи, которые должны произойти при получении данных, и они следующие (обратите внимание, это после того, как я объединилполученные данные с буфером):
- Частичное сообщение получено: Клиент начал передавать сообщение, и через него прошли только части сообщения (начало)еще.Полученные данные необходимо буферизовать до получения остальных.
- Получено целое сообщение: Клиент передал целое сообщение.Событие должно быть запущено с сообщением.
- Получен сигнал закрытия: Клиент отправил запрос на закрытие сигнала.
Сейчаснет веской причины, по которой несколько таких событий не должно происходить одновременно (например, получено полтора сообщения или получено одно сообщение и сигнал закрытия).Сообщения в веб-сокете обрамляются байтами 0x00 и 0xFF, другими словами, входящие сообщения выглядят так: 0x00,...binary UTF8 data,0xFF,0x00,...binary UTF8 data,0xFF
, а сигнал окончания выглядит так: 0xFF,0x00
.Теперь мне нужен эффективный способ взять входящий поток данных и разделить его на сообщения или конечный сигнал.Я никогда раньше не работал с такими данными в рамке, поэтому не уверен, как это сделать эффективно.Что я хотел бы, так это более или менее функция, которая принимает двоичные данные в виде массива и возвращает сообщения (в виде двоичных данных без фрейма) или флаг закрытия, а также байтовый массив с данными, подлежащими буферизации.Важно то, что это быстро и не потребляет слишком много ненужной памяти.Или, если у вас есть ссылки, которые могут помочь мне решить эту проблему, я с радостью приму их.