有没有什么好的建议,使用 javascript 还是 rails, 有没有现成的 Gem ?
Thx
#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 的话,都能找到对应的库
#9 楼 @yedingding 那不是很正常的啊,这是在普通页面上嵌入一个聊天栏,又不是你那单页应用,你当然要向所有标签页的聊天栏投递聊天消息了,不然消息来了,你让我先换标签页再能回复?
#14 楼 @yedingding 比如你开了两个 GMail 标签页啊,只要你当前是在其中一个就可以回复了。GMail 倒不会经常开多个,但是人人网就难说了啊。
@bhuztez 我也没看懂你什么意思,你说的一个标签页不就代表一个 client 吗?只要在一个 client 有动作(发言等),server 这边将内容推送到所有 client,client 看到 server 推送过来的内容,更新相应的内容不久完事了吗?
#16 楼 @willmouse 说起来是很容易啊,但没有现成的实现啊。XMPP 里的 BOSH,根本就不是这么定义的,HTTP Session 和 XMPP Session 是 1:1 的,现成的代码能支持 BOSH 就已经很不错了,所以得自己写了。
#21 楼 @yedingding 开多个 session 也是有问题的,虽说用 Ejabberd 写个 hook 挺容易的。但问题在于客户端,就是说有些客户端发消息的时候会指定 resource 的,这样就又是只会有一个标签页里的聊天栏会收到消息。
瞧瞧:ChatPro http://hlcfan.tk 主要是 Juggernaut https://github.com/maccman/juggernaut
@yedingding @nuclearkitten 我相信作业时间来不及研究这些了,最简单得就是用 ajax 轮询来实现 realtime 了,可以看看 nodejs 网站上那个聊天的 demo
之前做过一个 ajax 轮询+jsp+mysql 实现过群聊和私聊的,下载 现在用 rails+redis 的话代码会少很多吧... 群聊简单不用说了,私聊其实几个字段 id,from_who, to_who, content 就可以实现了,每次 ajax 轮询时候把上一次响应最后一条的 id 返回给服务器,这就解决了不同 client 开启相同标签时可能遇到的问题 话说现在有 websocket 了,有空就再做一个 websocket 的版本练练手...
https://github.com/jasl/chatroom.js socket.io 实现的简单聊天室,其实已经做成 qq 那样了,带一个 winform 实现的 client 不过因为带同学做,代码不太喜欢,就没放在上边
可以考虑采用 XMPP+BOSH,然后你就可以做成一个 IM 了,像 QQ 桌面+WebQQ,简单的加入到任何一个有用户系统的应用很容易;之所以要建议你采用现成的协议,是因为 IM 的 presence 比较难弄好。
题外话:新浪微博和人人的架构我不是太清楚,但是我可以肯定都是采用的 XMPP。