поскольку я использую соединения WebSocket на более регулярных базах, меня интересовало, как все работает под капотом. Таким образом, я долгое время врывался в бесконечные спецификации, но до сих пор я не мог найти ничего о том, как обманывать сам поток передачи.
Протокол WebSocket называет его фреймами данных (который описывает чистый поток данных, поэтому его также называют неконтролирующими кадрами). Насколько я понял спецификацию, нет определенной максимальной длины и не заданного значения MTU (максимальной единицы передачи), что, в свою очередь, означает, что один кадр данных WebSocket может содержать по спецификации (!) Бесконечный объем данных (пожалуйста, поправьте меня, если я ошибаюсь, я все еще участвую в этом).
После прочтения этого, я мгновенно настроил свой маленький сервер Node WebSocket. Поскольку у меня есть сильная история Ajax (также на потоковой передаче и Comet), мои ожидания были оригинальными: "Должен быть какой-то интерактивный режим для чтения данных во время его передачи". Но я неправ, не так ли?
Я начал с малого, с 4kb данных.
сервер
testSocket.emit( 'data', new Array( 4096 ).join( 'X' ) );
и, как и ожидалось, это придет на клиент как один блок данных
клиент
wsInstance.onmessage = function( data ) {
console.log( data.length ); // 4095
};
поэтому я увеличил полезную нагрузку, и я действительно ожидал снова, что в какой-то момент обработчик на стороне клиента onmessage
будет срабатывать повторно, эффектно блокируя передачу. Но, к моему шоку, этого никогда не было (node -сервер, протестированный на стороне Firefox, хром и сафари на стороне клиента). Моя самая большая полезная нагрузка была 80 МБ
testSocket.emit( 'data', new Array( 1024*1024*80 ).join( 'X' ) );
и он все еще прибыл в один большой блок данных на клиенте. Конечно, это занимает некоторое время, даже если у вас довольно хорошая связь. Вопросы здесь
- Есть ли возможность перерезать эти потоки, похожие на режим ReadyState3 XHR?
- существует ли ограничение по размеру для одного кадра данных ws?
- - это веб-сайты, которые не должны передавать такие большие полезные нагрузки? (что заставило бы меня снова задаться вопросом, почему нет определенного максимального размера)
Я могу по-прежнему смотреть с неправильной точки зрения на WebSockets, возможно, необходимость отправки больших объемов данных просто не существует, и вы должны полностью или частично разбивать какие-либо данные перед отправкой?