使用Action Cable将libwebsockets客户端连接到rails服务器

时间:2017-03-29 19:31:11

标签: ruby-on-rails websocket actioncable libwebsockets

我有一个使用动作电缆在rails 5上运行ruby的web服务器,并希望使用libwebsockets客户端连接到服务器。我无法让客户端通过操作电缆成功连接到服务器。 libwebsockets客户端永远不会收到成功连接的回调,并且总是超时。我的rails服务器在Ubuntu机器上运行nginx和thin,而客户端是在Visual Studio 2013中运行的C ++控制台应用程序。我按照https://github.com/macournoyer/thin/issues/298中的描述启用了actioncable / thin compability设置。我也使用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枚举29+)。我尝试从这些回调中发送消息,但实际上没有数据被发送,可能是因为客户端尚未触发连接的回调。

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

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

1 个答案:

答案 0 :(得分:0)

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