用XMPP4r来集成IM —— 第二节
来源:互联网 发布:淘宝卖家采集软件用法 编辑:程序博客网 时间:2024/06/11 08:50
用XMPP4r来集成IM —— 第二节
原文地址:http://www.rubyfleebie.com/im-integration-with-xmpp4r-2/
欢迎各位技术达人到www.taskcity.com赚美金。
在第一节,我们讨论了很多XMPP,而没怎么提到XMPP4r。这次我们要好好谈谈XMPP4r了。
现在,既然我们已经知道XMPP消息是通过TCP连接在客户端和服务器端之间交换的XML格式信息,那么我们就应该可以理解XMPP4r的目的了。
什么是XMPP4r?
这是我发现的XMPP4r的最简单定义:XMPP4r是一个作为XMPP客户端的ruby库。理解了这个,你就不会弄不清除XMPP4r是干什么的了。像其他jabber客户端(google talk,pidgin等)一样,XMPP4r发送,接受和管理叫做stanzas的XML消息。
在某些情况下,XMPP4r就像是没有GUI的GoogleTalk(当然,xmpp4r也没有准备集成GUI,所以你还得自己编写客户端行为)。使用GoogleTalk,你可以通过点击连接按钮连接Jabber服务器。使用XMPP4r,你可以通过下面的方式连接Jabber服务器:
- client = Client.new(JID::new("somejabberaccount@somewhere.com"))
- client.connect
- client.auth("my_extremely_secret_password")
- client.send(Presence.new.set_type(:available))
第一行只是简单的创建一个Client类的实例。这个实例展现了用户自己。第二行尝试在客户端和服务器端建立一个连接(somewhere.com)。第三行使用下面的几种型式验证用户。
- SASL DIGEST-MD5
- SASL PLAIN
- Non-SASL digest
该到第四行了。记得我在第一节说过的stanzas吗?那么,在第四行,我们发送我们的第一个stanza到Jabber服务器...一个出席stanza。我们这样做的原因就是我们想让服务器知道我们已经登陆了。这样,我们好友列表上的所有人都会知道我们在线,可以聊天了!
发送消息
现在该干什么了呢?你已经在线了,但是你如何给其他人发送消息呢?很简单...
- msg = Message::new("john@somejabberserver.com", "你好吗… John?")
- msg.type=:chat
- client.send(msg)
重要提示:你需要把消息类型设置为“聊天”,因为有些客户端会根据消息的类型作出不同的响应。如果你发送一条类型为“普通”的消息,Gajim用户就要鄙视你了,因为Gajim每次收到“普通”消息时都会弹出新的窗口,而每次收到来自同一用户的“聊天”消息时都会显示在同一窗口里。
现在我们知道如何给其他人发送消息了,但是如果那个人不在我们的好友列表呢?很简单,发送不了。XMPP不允许这种事情发生,而我们也都同意这样做。毕竟,谁愿意被骚扰呢?
如果我们想加john@someserver.com到我们的好友列表,就得这么做:
- pres=Presence.new.set_type(:subscribe).set_to("john@someserver.com")
- client.send(pres)
好的,我们已经发送了请求... 但是回应怎么办呢?幸运的是,我们不必等待上一行的结果。正如你预料的那样,结果可能非常长... 毕竟,我们不能控制来自其他客户端的回答。这样便引出了XMPP4r的一个关键特性:回调。
注册回调方法
让我们回头看看我们早先发送给John的加好友的请求。因为我们已经知道我们的代码不会等待响应,所以我们要另辟蹊径来获取即将来到的响应(用回调再好不过了,不是吗?)
因为我们发送了加好友请求,所以只要另一端一有回应,回调方法“add_update_callback”就会被调用。如果你想在这件事发生时得到提示,你就得注册这个回调方法。
- client.add_update_callback do |presence|
- if presence.from == "john@someserver.com" && presence.ask == :subscribe
- client.send(presence.from, "我很高兴你能接受我的请求John,哈哈!我下半辈子就黏上你了,但是我相信你会理解的,因为我感觉我们已经“连接”在一起了。")
- end
- end
XMPP4r出于很多目的而提供回调方法。现在如果我们希望在别人给我们发送消息时得到提示,我们该怎么办呢?答案就是"add_message_callback"!
- client.add_message_callback do |m|
- if m.from == "john@someserver.com"
- #太好了!我已经收到我新朋友John的回应了,看看他都说啥了。
- m.body
- #输出:听着,你这个白痴。我就不明白了你怎么就这么喜欢和一个陌生人聊天。但是我很强烈的建议你还是哪凉快哪呆着去吧。别在这废话了,否则我就会永远把你从名单上踢出去。
- end
这里还有一个很有用的回调方法可以让你跟踪好友状态改变。
- client.add_presence_callback do |old_presence, new_presence|
- if new_presence.from == "john@someserver.com" &&new_presence.show == :dnd
- msg = Message::new("john@someserver.com", "我知道你不想被人打搅,但是我还是跟你打个招呼!我已经看了你给我的消息了,但是我还是觉得我们已经“连接”在一起了。我权当你是突然头脑发热,一时糊涂吧。")
- msg.type=:chat
- client.send(msg)
- end
- end
提示一下xmpp4r的很多回调方法都运行在它们自己的线程上。
好的,到第二节的结尾了。下一节应该是关于Roster(花名册)帮助的。顺便鄙视一下XMPP4r的稳定性和不完整的帮助文档。
啊!差点忘了一个重要的更新(鄙视一下自己)
Don Park和Nilu使用此指南时遇到了问题,那全是因我忘记了基础部分:加好友。如果你想接受到别人的消息,你必须先得到别人的加好友请求!三个步骤:
- require ‘xmpp4r/roster’ (roster就是展示你好友列表的对象)
- roster = Roster::Helper.new(client)
- 实现add_subscription_request_callback (如果你想加上任何人) :
- roster.add_subscription_request_callback do |item,pres|
- roster.accept_subscription(pres.from)
- end
现在应该没有问题了,十分抱歉。
www.taskcity.com
taskcity.com将您的技术转化为美金。
- 用XMPP4r来集成IM —— 第二节
- 用XMPP4r来集成IM —— 第一节
- 用XMPP4r来集成IM ——需要避免的错误
- 使用XMPP4r在RubyOnRails中集成IM功能
- 环信IM集成 —— 聊天界面URL颜色展示
- 环信im集成
- 腾讯Im集成
- 融云IM集成
- android项目中集成融云IM之实现消息提供者来显示群名
- 谁来变革IM?
- OpenFire的Asterik-IM集成
- OpenFire的Asterik-IM集成
- iOS集成容联云通信 IM
- iOS - IM环信集成
- IM 与 LVB 集成方案:
- 网易im聊天室的集成
- Struts1.X与Spring集成——第二种方案
- IM软件业务知识—导航
- Ghost命令以及制作自动恢复光盘
- VS2005 + VSS2005 实现团队开发、源代码管理、版本控制
- struts2+spring+jpa(hibernate)
- 能计算综述zz
- 美,不能造作
- 用XMPP4r来集成IM —— 第二节
- 聚类和分类的区别
- Asp.Net下载页面,并弹出下载提示框
- 文本分类和聚类有什么区别?
- WebService学习之Axis2(1):用POJO实现0配置的WebService
- 业务了解和开发能力,孰重孰轻?
- rails 入门笔记(一)----- database.yml配置mysql
- WM 工作流设计器 v2.0(仿JBPM)
- 工程初体验之模仿收费系统