TCP сокеты основаны на потоке. Порядок гарантирован, но число байтов, которое вы получаете с каждым recv / read, может быть любым фрагментом ожидающих байтов от отправителя. Вы можете наложить транспорт на основе сообщений поверх TCP, добавив информацию кадрирования, чтобы указать способ, которым полезная нагрузка должна быть разбита на сообщения. Это то, что делает WebSockets. Каждое сообщение / фрейм WebSocket начинается не менее чем с 2 байтами информации заголовка, которая содержит длину полезной нагрузки, которая должна следовать. Это позволяет получателю ожидать и повторно собирать полные сообщения.
Например, для библиотек / интерфейсов, которые реализуют стандартный Websocket API или аналогичный API (например, браузер), событие onmessage будет запускаться один раз для каждого полученного сообщения, а атрибут данных события будет содержать все сообщение.
Обратите внимание, что в более ранней версии Hixie WebSockets каждый кадр начинался с '\ x00' и заканчивался '\ xff'. Текущая стандартизированная версия протокола IETF 6455 (HyBi) использует информацию заголовка, которая содержит длину, которая позволяет значительно упростить обработку кадров (но учтите, что и старый, и новый все еще основаны на сообщениях и имеют в основном один и тот же API). 1007 *