Ответы пользователя по тегу WebSocket
  • Как отправить сообщение в вебсокет распределенной системы?

    @xfg
    Необходимо так или иначе реализовать механизм pub/sub. Например через redis. Все сервера подписываются на redis канал. Кто-то из серверов публикует сообщение в redis-канал. Все сервера получают сообщение и дальше рассылают своим вебсокет-клиентам.

    Подобную реализацию для библиотеки socket.io можно посмотреть здесь/
    Ответ написан
    Комментировать
  • Как работать с websocket в php без библиотек?

    @xfg
    Прочитать соответствующий RFC https://tools.ietf.org/html/rfc6455 чтобы понять, как происходит рукопожатие и какие байты в переданном сообщении за что отвечают. После этого будет понятно как написать реализацию. Я досконально уже не помню, но фактически от клиента приходит обычный http запрос с определенными заголовками, сервер разбирает этот запрос и если всё ок, то сохраняет открытое соединение в массив, если нет, то отправляет соответствующий ответ и закрывает соединение. Дальше по открытому соединению начинает сыпаться поток байтов от клиента их нужно разбирать, чтобы понять длину сообщения, сами данные переданные в фрейме, закончился фрейм или еще нет и тому подобное. Обратно также кодировать данные в поток байтов и отправлять по открытому соединению. Каждый байт в переданном фрейме несет определенный смысл. Обо всем этом подробно написано в RFC, но на английском. Вообще это хорошо примерно понимать как работает, но глупо писать такую низкоуровневую реализацию, когда есть готовые. Такие вещи развивают и поддерживают годами. Вы же не пишите HTTP серверы, а берете готовые вроде nginx и тому подобное.

    В каком месте можно полученные данные подготовить к записи в бд.

    Как сделать, что бы на стороне клиента, один websocket отвечал за сообщения, другой за статьи. (Или за эти два действия отвечает один websocket, тогда как мне на сервере это различать).

    Вебсокет это низкоуровневая штука, для передачи потока байтов от клиента на сервер, в отличии например от HTTP, где есть заголовки и тело сообщения. Поверх вебсокета нужно делать еще один протокол или самописный или выбрать один из готовых. Это проще говоря, то как выглядят ваши фреймы (сообщения), которые вы отправляете с клиента на сервер и назад. Например клиент может отправлять такой фрейм:
    ["id", "controller/action", {param1: value1, param2: value2}]

    в ответ получать
    ["id", "OK"]
    если запрос был обработан успешно или
    ["id", "ERR", {error: "action not found"}]
    если произошла ошибка. По переданному id в массиве, можно понимать, к какому запросу относится ответ.
    Для уведомлений (событий) сервер может отправлять клиентам что-то такое
    ["user_added", {user: {...}}]
    и т.д. Этот протокол необходимо придумать самому или выбрать из готовых (популярных пока нет) и написать его реализацию (клиентскую и серверную часть) или опять же взять уже готовую.

    После того, как такой протокол будет написан, делаешь тоже самое, что делают обычные PHP фреймворки, пишешь роутер, который будет разбирать твои сообщения, понимать к какому контроллеру идет обращение, к какому экшену и вызывать его. В экшене уже будешь делать свои вызовы к базе данных.

    Но это уже всё должно быть, просто возьми real-time фреймворк. Там за тебя написали и websocket сервер и протокол поверх него и экшены уже есть. Всё низкоуровневое уже готово. Бери и пиши приложение. В nodejs самый популярный это например https://github.com/socketio/socket.io, а в php я не знаю, но уверен, что тоже есть что-то популярное.

    Своё написать не получится, без опыта и без попыток сделать приложение на чем-то готовом. Нужно как минимум прочитать RFC и посмотреть реализации других разработчиков. Для этого нужно быть кем-то больше, чем "программистом сайтов".
    Ответ написан
    1 комментарий
  • Поясните как реализовать личные сообщения по вебсокету?

    @xfg
    1. Пользователь устанавливает вебсокет соединение с сервером.
    2. Пользователь пробует добавить сообщение в чат. Отправляет запрос:
    {id: 1, action: 'chat:add', params: {chat_id: 1}}
    3. Сервер присылает ответ
    {id: 1, error: 'Not authenticated'}
    4. Пользователь отправляет
    {id: 2, action: 'user:login', params: {email: 'test@me', password: 'qwerty'}}

    5. Сервер отвечает
    {id: 2, data: {token: '123456'}}
    6. Пользователь повторяет пункт 2. Сервер отправляет пользователю успешный ответ, а его собеседника уведомляет новым личным сообщением.

    Это грубо. В целом, ты работаешь почти также как и с HTTP. В формате запрос -> ответ. Отличие только в том, что вместе с ответом на запрос, иногда нужно будет уведомлять других пользователей о произошедшем событии.

    Формат обмена сообщениями между клиентом и сервером надо придумать самому или выбрать из существующих. Клиент должен как-то различать, когда пришел ответ на запрос, а когда уведомление.
    Ответ написан
    Комментировать