Комментарии 26
> ну не нашел в документации про это ни слова
Об этом сказано в спецификации HTTP.
Об этом сказано в спецификации HTTP.
В своё время тоже делал свою реализацию протокола WebSocket средствами СУБД Caché, правда для 76 и 07 версии.
Но с внедрением нативной поддержки RFC 6455 необходимость в велосипеде отпала.
Но с внедрением нативной поддержки RFC 6455 необходимость в велосипеде отпала.
у меня при реализации, сообщения с сервера приходили в юникоде, причём браузер его не распознавал, соответственно понадобилась дополнительная функция на стороне клиента для декодирования.
не забудьте убрать лидирующие и конечные пробелыЛидирующие? Где они лидируют? «Начальные», наверное?
Смысл моей ошибки заключался в том, что браузер принимает заголовок с завершающей пустой строкой, а так как я ее не отправлял (ну не нашел в документации про это ни слова),…
Протокол Websockets, его первая фаза (http://ru.wikipedia.org/wiki/WebSocket) идет поверх HTTP, а в Спецификации НTTP, ясно сказано, что заголовок и тело разделяется пустой строкой.
У нас проект на php.
К сожалению, особенностей (конкретной реализации)WS серверов так много, что проще взять nodejs и работать с WS через неё. Даже простым exec-ом (если совсем что-то простое).
Нет ни одной библиотеки на php такого уровня, как уже довольно давно существующие пакеты для ноды.
Важно: все строчки выше применимы, когда вы пишете клиент!
Если вы пишите сервер, то «это уже совсем другая история»
К сожалению, особенностей (конкретной реализации)WS серверов так много, что проще взять nodejs и работать с WS через неё. Даже простым exec-ом (если совсем что-то простое).
Нет ни одной библиотеки на php такого уровня, как уже довольно давно существующие пакеты для ноды.
Важно: все строчки выше применимы, когда вы пишете клиент!
Если вы пишите сервер, то «это уже совсем другая история»
на PHP принципиально плохо что либо реализовывать для работы с WEBсокетами. Это связано с тем, что РНР предназначен для режима Запрс-Ответ… А работа с WEBсокетами предполагает долгосрочную жизнь процесу. Если работаем через nginx, то он проксирует все WEBсокетами. запросы на демон. т.е. мы должны запустить наш сервер, как отдельный демон.
В этом есть конечно свои плюсы, так и минусы. Недавно была переводная статья «РНР рожден, чтобы умереть», спорная конечно, но кое-что в ней подмечено верно. Хотя, в своих демонах я утечек памяти не наблюдал: специально был реализован мониторинг и по памяти в том числе.
В этом есть конечно свои плюсы, так и минусы. Недавно была переводная статья «РНР рожден, чтобы умереть», спорная конечно, но кое-что в ней подмечено верно. Хотя, в своих демонах я утечек памяти не наблюдал: специально был реализован мониторинг и по памяти в том числе.
PhpDaemon на тесте себя вполне нормально показывал. До продакшена, правда, не дошло, но не из-за проблем на сервер-сайде.
Вот тут конечно они сильно замудрили.
Это стандартный спосои кодирование передаваемых данных… Перед данными устанавливается 3 бита длинны данных, далее идет длинна 1-3 байта, потом сами данные.
Это стандартный спосои кодирование передаваемых данных… Перед данными устанавливается 3 бита длинны данных, далее идет длинна 1-3 байта, потом сами данные.
Как-то я тоже реализовал вебсокет-сервер на гипертекстовом препроцессоре, наступив на все упомянутые Вами грабли. Итоговый двухколёсный демон был непредсказуем и очень неудобен в поддержке. После чего для таких вещей я перешёл на python, о чём ни разу не жалею.
Связка Tornado + Tornadio + Socket.io чудесно работает с веб-сокетами из коробки, поддерживает кучу других транспортов (graceful degradation), красива, логична, поддерживается огромным коммьюнити. И показательно, кстати, что для Socket.io не существует ни одного php-бэкэнда.
Связка Tornado + Tornadio + Socket.io чудесно работает с веб-сокетами из коробки, поддерживает кучу других транспортов (graceful degradation), красива, логична, поддерживается огромным коммьюнити. И показательно, кстати, что для Socket.io не существует ни одного php-бэкэнда.
О, спасибо за напоминание! Надо бы дописать библиотечку (забросил на стадии интерфейсов fork/pthreads).
Обновил топик. Переработал функцию hybi10Decode(), чтобы она разделяла подрял идущие фреймы.
Ставить плюс уже поздно, но большое спасибо!
Перерыл весь интернет, реализовывая вебсокеты на php-проекте, но только эта статья (а особенно спойлер!) помогли решить проблему окончательно.
Благодарю!
Перерыл весь интернет, реализовывая вебсокеты на php-проекте, но только эта статья (а особенно спойлер!) помогли решить проблему окончательно.
Благодарю!
У меня проблема с флагами RVS1, RVS2, RVS3 уже очень долго ответ не могу найти. Я реализую свой WebSocket сервер на С++ и всё хорошо работает, но когда время между отправкой сообщений из браузера на сервер маленькое (меньше 50 миллисекунд) то фреймы приходящие сначала начинают приходить вместе то есть в одном принимаемом сообщении 2 и более фреймов умещается но это мелочь, потом браузер присылает фрейм с не нулевыми значениями RVS1, RVS2, RVS3 и я не знаю как такие декодировать, в итоге соединение приходится закрывать соединение.
Использую Sec-WebSocket-Version 13
Использую Sec-WebSocket-Version 13
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
WebSocket (Sec-WebSocket-Version: 13) — тонкости реализации, в частности на PHP