用XMPP4r来集成IM —— 第二节

本文介绍如何使用Ruby库XMPP4r进行即时通讯(IM)集成,包括连接服务器、发送接收消息及好友请求处理等核心操作,并探讨了回调方法的应用。

 用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值