Подключение клиента libwebsockets к серверу rails с помощью кабеля Action Cable

У меня есть веб-сервер, работающий на ruby ​​on rails 5 с кабелем действия, и я хочу использовать клиент libwebsockets для подключения к серверу. Я не могу заставить клиента успешно подключиться к серверу с помощью кабеля действия. Клиент libwebsockets никогда не получает обратный вызов для успешного подключения и всегда истекает. Мой сервер rails работает на nginx и тонкий на машине Ubuntu, в то время как клиент представляет собой консольное приложение C++, работающее в Visual Studio 2013. У меня включены настройки совместимости actioncable/thin, как описано в https://github.com/macournoyer/thin/issues/298. Я также использую Redis для кабеля действия.

Я пробовал регистрировать и отлаживать все, что мог придумать. Может ли кто-нибудь указать мне правильное направление для подключения клиента libwebsockets?


Подробнее:

Первоначально мой сервер rails был настроен на использование websocket-rails, и это работало с образцом клиента, представленным в официальном репозитории libwebsockets github: https://github.com/warmcat/libwebsockets/tree/master/test-server. Однако время ожидания этого же клиента истекает при попытке подключиться к серверу, работающему с активным кабелем. Я убедился, что кабель действия правильно настроен на моем сервере rails, внедрив код кабеля действия на стороне клиента javascript, и я могу успешно подключиться к серверу кабеля действия и подписаться на канал. Основываясь на ответе https://stackoverflow.com/a/36120630/3298688, мне нужно, чтобы клиент libwebsockets отправил сообщение подписки сразу после подключения, но клиент никогда не подключается, поэтому я не могу отправить это сообщение.

Мой журнал rails показывает, что сервер успешно получил запрос от клиента. Этот блок записи журнала был активирован дважды в течение одной и той же секунды, поэтому имеется неизвестный повторяющийся запрос; этого не произошло при подключении к websocket-rails. Я вижу, что сервер принимает соединение от клиента, так как появилось мое пользовательское сообщение регистратора. Это повторяется каждый раз, когда время ожидания клиента истекает, и он пытается повторно подключиться.

Started GET "/websocket" for 127.0.0.1 at 2017-03-29 11:33:51 -0700
Started GET "/websocket/" [WebSocket] for 127.0.0.1 at 3/29/2017 11:33 AM
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
****** My custom logger message: ApplicationCable::Connection#connect was called!
Registered connection (Z2lkOi8vcHJvcGVydHktbWF0cml4L0xvZ2luLzk2)

Я зарегистрировал все причины обратного вызова, которые срабатывают в клиенте libwebsockets, и я никогда не вижу обратного вызова для LWS_CALLBACK_CLIENT_ESTABLISHED. Все обратные вызовы связаны с опросом (перечисление lws_callback_reasons 29+). Я попытался отправить сообщение из этих обратных вызовов, но на самом деле данные не отправляются, вероятно, потому, что клиент еще не инициировал подключенный обратный вызов.

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

Finished "/websocket/" [WebSocket] for 127.0.0.1 at 3/29/2017 11:57 AM

person FaithoftheFallen    schedule 29.03.2017    source источник


Ответы (1)


Это не прямой ответ на первоначальный вопрос, но я просто отказался от libwebsockets и вместо этого использовал Chromium Embedded Framework, чтобы вложить невидимый браузер в мое приложение, что позволило мне просто загрузить веб-страницу из моего приложения Rails и таким образом передавать данные. Настройка по-прежнему была сложной, но я не сталкивался с какими-либо странными проблемами с подключением, так как смог использовать встроенный javascript для кабеля действия.

person FaithoftheFallen    schedule 24.01.2019