1

我有一个在 ruby​​ on rails 5 上运行的 Web 服务器,带有动作电缆,并希望使用 libwebsockets 客户端连接到服务器。我无法让客户端通过操作电缆成功连接到服务器。libwebsockets 客户端永远不会收到成功连接的回调并且总是超时。我的 Rails 服务器在 nginx 上运行,在 Ubuntu 机器上运行,而客户端是在 Visual Studio 2013 中运行的 C++ 控制台应用程序。我启用了 actioncable/thin 兼容性设置,如https://github.com/macournoyer/中所述瘦/问题/298。我也在使用 redis 作为动作电缆。

我已经尝试过记录和调试我能想到的一切。有人可以为我指出正确的方向来让 libwebsockets 客户端连接吗?


更多细节:

我最初将我的 rails 服务器设置为使用 websocket-rails,这与官方 libwebsockets github 存储库中提供的示例客户端一起使用:https ://github.com/warmcat/libwebsockets/tree/master/test-server 。但是,当尝试连接到使用操作电缆运行的服务器时,同一客户端会超时。我通过实现 javascript 客户端操作电缆代码验证了我在我的 Rails 服务器上正确设置了操作电缆,并且我可以成功连接到操作电缆服务器并订阅频道。根据答案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 enum 29+)。我试图从这些回调中发送消息,但实际上没有发送任何数据,可能是因为客户端尚未触发连接的回调。

当我关闭客户端应用程序时,rails 日志中出现以下消息两次,因此看起来 rails 服务器没有任何问题。

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

1 回答 1

0

这不是对原始问题的直接回答,但我只是放弃了 libwebsockets,而是使用Chromium Embedded Framework在我的应用程序中嵌套了一个不可见的浏览器,这让我可以从我的 Rails 应用程序加载一个网页并传输数据那样。设置起来仍然很痛苦,但我没有遇到任何奇怪的连接问题,因为我能够使用内置的 JavaScript 进行动作电缆。

于 2019-01-24T00:09:41.183 回答