用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服务器:

Ruby代码
  1. client = Client.new(JID::new("somejabberaccount@somewhere.com"))  
  2. client.connect  
  3. client.auth("my_extremely_secret_password")  
  4. client.send(Presence.new.set_type(:available)) 

第一行只是简单的创建一个Client类的实例。这个实例展现了用户自己。第二行尝试在客户端和服务器端建立一个连接(somewhere.com)。第三行使用下面的几种型式验证用户。

  • SASL DIGEST-MD5
  • SASL PLAIN
  • Non-SASL digest

该到第四行了。记得我在第一节说过的stanzas吗?那么,在第四行,我们发送我们的第一个stanza到Jabber服务器...一个出席stanza。我们这样做的原因就是我们想让服务器知道我们已经登陆了。这样,我们好友列表上的所有人都会知道我们在线,可以聊天了!

 

发送消息

现在该干什么了呢?你已经在线了,但是你如何给其他人发送消息呢?很简单...

Ruby代码
  1. msg = Message::new("john@somejabberserver.com""你好吗… John?")  
  2. msg.type=:chat  
  3. client.send(msg) 

重要提示:你需要把消息类型设置为“聊天”,因为有些客户端会根据消息的类型作出不同的响应。如果你发送一条类型为“普通”的消息,Gajim用户就要鄙视你了,因为Gajim每次收到“普通”消息时都会弹出新的窗口,而每次收到来自同一用户的“聊天”消息时都会显示在同一窗口里。

现在我们知道如何给其他人发送消息了,但是如果那个人不在我们的好友列表呢?很简单,发送不了。XMPP不允许这种事情发生,而我们也都同意这样做。毕竟,谁愿意被骚扰呢?

如果我们想加john@someserver.com到我们的好友列表,就得这么做:

Ruby代码
  1. pres=Presence.new.set_type(:subscribe).set_to("john@someserver.com")  
  2. client.send(pres) 

好的,我们已经发送了请求... 但是回应怎么办呢?幸运的是,我们不必等待上一行的结果。正如你预料的那样,结果可能非常长... 毕竟,我们不能控制来自其他客户端的回答。这样便引出了XMPP4r的一个关键特性:回调

注册回调方法

让我们回头看看我们早先发送给John的加好友的请求。因为我们已经知道我们的代码不会等待响应,所以我们要另辟蹊径来获取即将来到的响应(用回调再好不过了,不是吗?)

因为我们发送了加好友请求所以只要另一端一有回应,回调方法“add_update_callback”就会被调用。如果你想在这件事发生时得到提示,你就得注册这个回调方法。

Ruby代码
  1. client.add_update_callback do |presence|  
  2.     if presence.from == "john@someserver.com" && presence.ask == :subscribe  
  3.         client.send(presence.from, "我很高兴你能接受我的请求John,哈哈!我下半辈子就黏上你了,但是我相信你会理解的,因为我感觉我们已经“连接”在一起了。")  
  4.     end  
  5. end 

XMPP4r出于很多目的而提供回调方法。现在如果我们希望在别人给我们发送消息时得到提示,我们该怎么办呢?答案就是"add_message_callback"!

Ruby代码
  1. client.add_message_callback do |m|  
  2.     if m.from == "john@someserver.com"  
  3.        #太好了!我已经收到我新朋友John的回应了,看看他都说啥了。  
  4.        m.body  
  5.        #输出:听着,你这个白痴。我就不明白了你怎么就这么喜欢和一个陌生人聊天。但是我很强烈的建议你还是哪凉快哪呆着去吧。别在这废话了,否则我就会永远把你从名单上踢出去。  
  6.     end  

这里还有一个很有用的回调方法可以让你跟踪好友状态改变。

Ruby代码
  1. client.add_presence_callback do |old_presence, new_presence|  
  2.     if new_presence.from == "john@someserver.com" &&new_presence.show == :dnd  
  3.         msg = Message::new("john@someserver.com""我知道你不想被人打搅,但是我还是跟你打个招呼!我已经看了你给我的消息了,但是我还是觉得我们已经“连接”在一起了。我权当你是突然头脑发热,一时糊涂吧。")  
  4.         msg.type=:chat  
  5.         client.send(msg)  
  6.     end  
  7. end 

提示一下xmpp4r的很多回调方法都运行在它们自己的线程上。

好的,到第二节的结尾了。下一节应该是关于Roster(花名册)帮助的。顺便鄙视一下XMPP4r的稳定性和不完整的帮助文档。

啊!差点忘了一个重要的更新(鄙视一下自己)

Don Park和Nilu使用此指南时遇到了问题,那全是因我忘记了基础部分:加好友。如果你想接受到别人的消息,你必须先得到别人的加好友请求!三个步骤:

  1. require ‘xmpp4r/roster’ (roster就是展示你好友列表的对象)
  2. roster = Roster::Helper.new(client)
  3. 实现add_subscription_request_callback (如果你想加上任何人) :
Ruby代码
  1. roster.add_subscription_request_callback do |item,pres|   
  2.     roster.accept_subscription(pres.from)  
  3. end 

现在应该没有问题了,十分抱歉。

www.taskcity.com

taskcity.com将您的技术转化为美金。

taskcity.com

原创粉丝点击