您现在的位置: J2ME开发网 >> Symbian >> 网络编程 >> 文章正文
Jabber即时通讯客户端(二
作者:huwell    文章来源:huwell    点击数:    更新时间:2006-4-26
Logging in
  
  这时服务器等待你的身份验证,你使用<iq>询问[JPO 1.5]来发送你的认证信息,而服务器据此返回一个回应,指示你的登录是否成功。[JPO 1.5.3.3]

  具体来说,询问使用jabber:iq:auth空间名称和<username>以及<resource>元素来标识用户的jabber ID和计算机的resource名[JPO 1.6.3] 。

  在认证过程中,使用明文传递密码是不提倡的,比较安全的做法是配合使用一个包含已编码digest的<digest>元素。这个digest是根据session ID和密码组合成的字符串,结合SHA-1算法生成一个20个字节的散列,然后再将其转变为40个字节的16进制形式。当发出这个登录询问后,就开始等待回应了。接下来你会收到<iq type=”reply”>的数据,至此,你已经成功登录了。假如回应中type="error",则表示登录失败,这时得立即关闭session了。

  Logging Out

  当要注销退出时,只需简单的发出”</stream:stream>”数据即可,这样就通知服务器,本次XML数据流结束,然后关闭socket。有时候,socket会出乎意料的关闭,比如说当Jabber服务器进程中断时。比较严重的问题是,一般TCP Socket不能分辨清楚一个空闲连接和一个断开的连接(可能发生在计算机崩溃或网络断开时),这时不会收到任何数据,这对一个向jabber一样的实时通讯协议来说,是个棘手的问题:你可以想象一下,此时你仍然在线,而你的好友列表还是有效,但除非你试图发送一个讯息,否则你不会知道你已经断开连接了。更为严重的是,一些防火墙和路由器在发现你长时间没有动作后,会做自动断开连接。

  有两种方法来解决这个问题,一种比较简单,就是每隔一分钟左右的时间就发送一个bit的XML数据,假如你的计算机没有得到服务器的回应,操作系统就将检查连接是否断开,并指出一个错误。还有一种复杂的方法就是设置你操作系统的网络API中套接字的”keep-alive”选项,只需将超时间隔调整到几分钟即可,这个方法是否可行,依赖于你的操作系统(在win32平台上,可以用setsockopt函数配合SO_KEEPALIVE或SO_KEEPALIVE_VALS来修改这个选项)。

  
  • 用户在线状态
      
      即时通讯客户端程序中要处理的一个重要模块就是,通知服务器用户的在线状态。当你登录后或改变在线状态时,都需要通知服务器。(比如QQ中经常使用的“我在吃饭,请过一会儿再和我联系”,“我正在工作中”等等,这些都属于用户的在线状态)

      要报告一个状态信息的改变,只需要发送一个<presence>元素[JPO 1.4]。它的类型属性不是available就是unavailable。你不需要添加"from"或"to"属性,服务器在将你的状态信息发给你的好友时,会自动添加它们。[JPO 1.4.1.1,1.4.1.5]unavailable状态可以很方便的使用户处于“隐身”:在你的好友看起来,你就象根本没有在线。

      接受你好友的在线信息正好相反:你会收到他们发送的<presence>数据。当你登录后,你会收到每位好友这样的数据,以更新你好友列表的内容。这个元素可能包括一个使用jabber:x:delay命名空间的<x>标记,来通知你好友状态信息最后改变的时间。[JPO 1.6.18, JPG p.89]只要你在线,这些状态信息随时都会发送给你。


      
  • 管理好友列表
      
      好友资料(Roster)的管理是一个比较头疼的事情,至少从现在协议的描述来看。

      How the roster works

      好友资料的处理工作包括:用户的状态,好友的状态以及那些想加好友但尚未验证通过的请求。Jabber服务器存储用户的好友资料,并负责在如下情况下通知已登录的用户其好友资料的改变:用户添加或删除一个好友,其他用户在好友列表中添加或删除你,用户通过或拒绝加入好友的验证。这些都笼统的称作好友资料更新。这些更新通知都是作为<iq>元素(使用jabber:iq:roster命名空间)数据来发送的。当然,客户端也可以主动请求好友资料的更新:这个在登录后通常都应该进行一次,以更新本地客户端的好友资料。

      Subscribing & unsubscribing buddies

      添加或删除好友是通过<presence>元素来进行的,它的type属性是subscribe或unsubscribe。接收或拒绝都是通过<presence>元素来进行的(请求和应答都有同样的ID号)总之,当你的好友资料改变时,服务器就会主动通知你情况的改变。前面已经说过,PHP编写的WellJabber有很多限制,其中一条就是除非你主动要求更新好友资料,否则很难及时反映好友在线情况。

      Manually updating the roster
      
      如果你想更新服务器端的好友资料,可以发送<iq type=”set”>元素,你这样做并不是添加或删除好友,而是更新与好友相关的资料,比如他们的昵称或所属组名。[JPO 1.6.12]

      More roster info

      完整的好友信息可以在通过一个<iq>询问接受vCard资料时获得,前提是如果他们存储了这样的信息[JPO 1.6.26]。(关于vCard,实在又是一个很大的论题,所以作为演示例子的WellJabber没有包含它)
  • 论坛新帖