Rails 想给项目加一个聊天功能,就像人人那样的

匿名 · 2012年08月19日 · 最后由 msl12 回复于 2017年07月14日 · 7621 次阅读

有没有什么好的建议,使用 javascript 还是 rails, 有没有现成的 Gem ?

Thx

匿名 #2 2012年08月19日

这是 realtime web 技术,这个要研究了

匿名 #3 2012年08月19日

#1 楼 @yggg 老师较搞的,老师什么都不讲,就让自由发挥

这个有点难度啊

需要支持多少浏览器

匿名 #6 2012年08月19日

#4 楼 @yedingding ie, chrome, safari

#4 楼 @yedingding 这个只是次要问题,这种类型的聊天最坑的地方在于,你要把聊天消息投递到所有标签页的聊天栏里面。接着,你就得去改别人的库和服务端实现。如果不是这样,其实 Ejabberd+Stroph.js 就够用了,根本就没多少要做的。

Rails + socket.io + node.js

主要的后端用 Rails 做,另外一个后端 node + socket.io 负责聊天的相关功能,在 Rails 项目中用前端的 socket.io 和后端 node 中的 socket.io 通信。

#5 楼 @nuclearkitten 有几种选择:1. 走 Comet,比如 Faye 2. 走 XMPP,可以用 ejabberd/openfire + strope 3. chrome/safari 用 websocket,IE 用 flash fallback 技术选型主要这么几种,服务端无论用 Ruby 还是 Node 的话,都能找到对应的库

#6 楼 @bhuztez 不理解为啥要投递到所有标签页的聊天栏里面,你是说一个账号开着多个 tab?

匿名 #11 2012年08月19日

#8 楼 @yedingding 谢谢哈,这个怎么这么麻烦啊,不同的浏览器还要用不同的技术实现,上次你那个 railscast 也是实现 chat 功能的么?

#9 楼 @yedingding 那不是很正常的啊,这是在普通页面上嵌入一个聊天栏,又不是你那单页应用,你当然要向所有标签页的聊天栏投递聊天消息了,不然消息来了,你让我先换标签页再能回复?

#10 楼 @nuclearkitten 刚接触是有挺多要学习的,可以都玩一下,会有挺多收获的

表示关注

#11 楼 @bhuztez 还是不理解,就是 web gtalk 来了消息你也得先换标签页再回复啊。

#14 楼 @yedingding 比如你开了两个 GMail 标签页啊,只要你当前是在其中一个就可以回复了。GMail 倒不会经常开多个,但是人人网就难说了啊。

@bhuztez 我也没看懂你什么意思,你说的一个标签页不就代表一个 client 吗?只要在一个 client 有动作(发言等),server 这边将内容推送到所有 client,client 看到 server 推送过来的内容,更新相应的内容不久完事了吗?

#16 楼 @willmouse 说起来是很容易啊,但没有现成的实现啊。XMPP 里的 BOSH,根本就不是这么定义的,HTTP Session 和 XMPP Session 是 1:1 的,现成的代码能支持 BOSH 就已经很不错了,所以得自己写了。

#15 楼 @bhuztez 喔,这很正常啊。每个 tab 开个 session,往所有 session 发消息就可以了

#17 楼 @bhuztez socket.io + node.js 做这个在适合不过了,你可以考虑换个思路,不要用 XMPP

#19 楼 @willmouse 我是说,你得自己写代码了,这样就麻烦了。

#20 楼 @bhuztez 总的来说采用上面的方式实现聊天的功能,所要做的工作真的是很少,其实 node + socket.io 一个主打的演示项目就是聊天室,就像展示 Rails 给别人看的时候,经常是那个快速开发 Blog 一样。

#21 楼 @yedingding 开多个 session 也是有问题的,虽说用 Ejabberd 写个 hook 挺容易的。但问题在于客户端,就是说有些客户端发消息的时候会指定 resource 的,这样就又是只会有一个标签页里的聊天栏会收到消息。

#23 楼 @bhuztez 聊天都是走 web 的,不需要支持客户端吧。另外,可以发给所有 resources. 不过,不太确定这个需不需要像你说的要 hack,ejabberd 的单对单聊天我没在实际项目上上过。

#24 楼 @yedingding 人人的聊天可是有客户端的,且支持普通的 XMPP 客户端的

#24 楼 @yedingding 明显需要,不然我早放代码出来了。

#25 楼 @bhuztez 要支持客户端就有需要了。Adium 这些基于 libpurple 好像都是直接指定了 resource

#26 楼 @bhuztez 放吧,对作者也是个帮助

#28 楼 @yedingding 所以现在没有能用的代码...

#29 楼 @bhuztez 你可以放不需要的代码...

匿名 #33 2012年08月19日

@yedingding @nuclearkitten 我相信作业时间来不及研究这些了,最简单得就是用 ajax 轮询来实现 realtime 了,可以看看 nodejs 网站上那个聊天的 demo

socket.io 或者 Meteor 都是 nodejs 的。

之前做过一个 ajax 轮询 +jsp+mysql 实现过群聊和私聊的,下载 现在用 rails+redis 的话代码会少很多吧... 群聊简单不用说了,私聊其实几个字段 id,from_who, to_who, content 就可以实现了,每次 ajax 轮询时候把上一次响应最后一条的 id 返回给服务器,这就解决了不同 client 开启相同标签时可能遇到的问题 话说现在有 websocket 了,有空就再做一个 websocket 的版本练练手...

匿名 #37 2012年08月20日

或许你可以了解一下http://meteor.com

pusher.com

#31 楼 @yedingding 其实早就知道有个现成的,除了主题怎么都不觉得靠谱,给 LZ 用可能正好合适 http://ajaxim.com/

简单使用 faye 复杂一点,用 xmpp

要支持客户端的话,socket.io 就不算是个很好的选择了

https://github.com/jasl/chatroom.js socket.io 实现的简单聊天室,其实已经做成 qq 那样了,带一个 winform 实现的 client 不过因为带同学做,代码不太喜欢,就没放在上边

@nuclearkitten 用这个http://getvines.org

是基于 xmpp 协议的,导入几个 gem 就可以了。

匿名 #44 2012年08月22日

Thank you guys, tring to implement

现在就在做这个,基于 cometd 改造的 cometd 的可定制性还是很强的

#44 楼 @edokeh 看了下 faye ,原来跟 cometd 一样都是基于 bayeux 协议 只是 cometd 是 java 的,faye 是 ruby 的

可以考虑采用 XMPP+BOSH,然后你就可以做成一个 IM 了,像 QQ 桌面 +WebQQ,简单的加入到任何一个有用户系统的应用很容易;之所以要建议你采用现成的协议,是因为 IM 的 presence 比较难弄好。

题外话:新浪微博和人人的架构我不是太清楚,但是我可以肯定都是采用的 XMPP。

现在的话直接用websocket就好了吧

需要 登录 后方可回复, 如果你还没有账号请 注册新账号