先给出地址:
http://code.google.com/p/canhaschat/
再给出试用环境:
ubuntu 7.1
ruby 1.8.6
rails 2.0.2 (并不是必须的,1.2.6以上就行)
xmpp4r 0.3.2 (XMPP4R (http://xmpp4r.rubyforge.org/) 安装:sudo gem install xmpp4r)
json 1.1.2(JSON (http://json.rubyforge.org/), 安装:sudo gem install json)
canhaschat是什么版本的不清楚,反正是2008年2月左右的。
openfire 3.4.5 (jabber服务器,java的,需要jdk支持)
jdk 1.6 (1.5以上就可以,用来运行openfire)
虽然在README上看好象是挺简单的,但实际上还是有不少陷阱的。
先创建一个rails应用:testchat。配好数据库之类。
进入testchat目录,然后安装插件:
./script/plugin install http://canhaschat.googlecode.com/svn/trunk/canhaschat
生成:
./script/generate chat_system chat_user chat
chat_system是指生成整个web通讯系统,chat_user是model名,chat是controller名。
生成后配置一下config/chat_server.yml,主要是把use_anonymous_jabber设为false,这样传送用户名才不会出错。似乎chat_server.rb里的逻辑判断有点问题,这里搞了好长时间。而且出错总是一个未知错误,要看日志或跟踪进去才能搞清真正的错误。
另外jabber_server设置为jabber服务器地址,一般是localhost。它是根据这个去连接openfire的。
jabber_realm这个是域名,在配置openfire的时候输入的域名,不管是什么名字都要保证dns指向本机。
openfire的安装不复杂,基本上设好jdk后就可以启动了,进入9090的管理端口,然后配置一下。不过要事先配好它的数据库,支持mysql。
在openfire里创建两个用户备用,用来互发。
试着启动一下chat_server :
./script/chat_server start
一般来说都能正常启动,因为基本上仅仅是启动了一个drb server,并没有实际连接jabber server。可以查看logs/development.chat_server.log ,了解运行情况,如果需要debug信息,则配置 chat_server.yml,设log_level=debug
再启动mongrell
mongrel_rails start -S ./chat_mongrel_handler.rb
这时候访问 http://localhost:3000/chat,会出现很多输入框。前两个是进入openfire的用户名和密码。
jabber的登录基本上由几部分构成:
用户名:在openfire里创建。
域名:在初始openfire配置的时候设置,在chat_server.yml里配置。
密码:在openfire里创建,在输入框里输入。
服务器地址:在chat_server.yml里配置。端口缺省是5222,加密为可选。
填好后就start chat。
如果幸运的话应该是可以进入一个比较简陋的页面,最上面是发过来的话,中间是好友列表,最下面是发送的话。先点一下某好友,再输入要发的话,再点Send。
要测试的用户最好是事先用客户端先测过,相互加好友。pidgin和Spark都是不错的客户端。
这里还有几个问题,发送消息时可能会遇到。
一是CanHasChat::Remote::MustSupplyPassword无法找到定义,简单地处理就是在ChatController里去掉就行了。
二是去掉所有的transports后会出错。transports就是经过jabber server去连接其他的即时通讯软件(如:aim, icq, google等)。在model和chat_server.yml里可以去掉transports。但实际上有点问题,是在chat_server.rb里的方法get_transport,只判断tid是否为nil,而没有判断是否为空字符串,第一句改为:
if tid!=nil && !tid.empty?
总之出现问题就查看日志,如果是发送消息或接收消息的问题,就用firebug看连接的返回,缺省的情况下错误是不会显示出来的,只能看response了。
它的结构有点复杂,ajax通过mongrel handle来实现push,然后与一个独立的chat server进行交互(drb),最后是连接jabber server。
ajax实际上是启动了一个周期为30s的长连接,是一种轮询+长连接的方式,一旦到了30s就自动结束,并且再启动一个相同的30s长连接。
当然了,只要一有消息就立即返回给 ajax,并不会到30s再返回,这样保证了即时性。
chat server里用了callback的方式来接受消息,这得益于xmpp4r的运行方式。
经过一系列摸索后,完全可以比较好地实现一个web即时通讯,在rails之上,与rails的结合也比较方便。使用纯ajax,没有用flash插件来实现长连接。不过它使用了mongrel handle,所以必须要启动mongrel并且加载handle。
实际上长连接是可以不需要通过mongrel的,但是使用mongrel handle的性能比较好,绕过了rails,因为rails对这方面的处理是很糟的。
canhaschat处理错误是很糟糕的,这方面在实际使用的时候一定要注意,要及时将错误写入日志,并且要作必要的提示。