ruby on rails聊天应用程序通过端口80托管站点不可知(没有闪存和websockets)

时间:2014-01-14 09:25:20

标签: ruby-on-rails ruby ruby-on-rails-4 faye

想要建立一个类似应用程序的聊天(即双向消息传递给多个连接的客户端)。看着Faye的宝石,但它开辟了一个除80端口之外的新港口。

最大的问题是,如果客户端位于防火墙之后,除了80之外的所有其他端口的访问都受到限制,并非所有托管站点都提供支持。

ActionController :: Live组件没有任何注册客户端的机制,因此在特定事件发生时无法将消息传递给已注册的客户端。

寻找一个解决方案,其中活动客户端存储在集合(数组或类似的东西)中,并且当任何活动客户端发送消息时,可以迭代集合并且可以在其上写入消息。所有这些必须只通过端口80发生。

2 个答案:

答案 0 :(得分:1)

好问题 - 实施了类似的东西,让我解释一下它是如何运作的:


<强>连接

“实时”Web应用程序根本不是“实时” - 它只是一个持久的请求;意味着它仍然与“普通”Rails应用程序完全相同,除非客户端不关闭连接(因此您有兴趣打开另一个端口)

处理请求的方式就是魔术发生的地方。这与客户端一样多,就像Rails(服务器端)

一样

<强>客户

当您连接到“聊天”应用程序时,您的浏览器正在打开与服务器的实时连接。这通常通过server sent events (Ajax long polling)web sockets

完成

这种方法的工作方式是使用普通的Rails ActionDispatch middleware打开连接,然后允许你连接

如果你玩过ActionController::Live功能,你会发现它不是典型的控制器动作。它实际上是一个单独的技术(如resqueRedis),您可以从另一个控制器操作调用它。

为空间提供了很好的空间

服务器

你处理这样的事情的方法是分离“实时”功能和“普通”Rails应用程序。它是current down-falls of Rails中的一个 - 因为使用nodeJS来处理实时数据(使用类似socket.io的端点),同时使用Rails可能更好处理身份验证和授权

从服务器的角度来看,它的工作是处理传入和传输。传出请求 - 不处理持久连接。所以我想你可能想看看你可以“外包”websocket连接的方法。不可否认,我在这方面的经验略显薄弱,所以你可以很好地搜索网络


<强>解决方案

我们使用名为Pusher

的第三方系统取得了很大成功

这是一个Web套接字系统,允许您作为客户端打开持久连接,并以与Redis类似的方式与Rails集成(您可以推送到它)

这意味着您可以使用Rails(chat.yourapp.com)托管“聊天”应用,将消息发送到您的Rails应用(http://yourapp.com/chat/send),然后处理来电聊天来自推动者(或类似的)

答案 1 :(得分:0)

也许你想使用我的开源彗星网络服务器(https://github.com/TorstenRobitzki/Sioux)。有一个ruby网络聊天示例。我使用它来实现带有rails(http://dungeonpilot.com)的交互式角色扮演地图。