Jabber即时通讯客户端(三)(转)

发送/接收信息

  发送信息时,使用一个元素[JPO 1.3],它使用”to”属性来标识接收者;反之,你接受包含”from”属性的元素,它标识了发送者。

  实际上,任何人都可以发送信息给别人,你不需要特定的权限就可以查看到别人的在线状态。这会造成信息的骚扰与泛滥吗?要解决这个情况,就要使程序有对信息进行筛选的能力,只允许从好友处来的信息,其他一律过滤掉。

  Message attributes
  我们收到的任何信息都包括一个属性,它给出了信息的发送者。同电子邮件相比,它的认证更为可靠,因为这个属性是由jabber服务器端来添加的,这就减少了发送者进行欺诈行为的可能性。

  一个信息还应该包括一个元素,它标识了本次信息的主题,但显示与否取决于接收者所使用的客户端程序。

  一个信息还可以包括一个时间戳,这是用一个元素来实现的,它使用了jabber:x:delay命名空间。

  而使用jabber:x:envelope命名空间还可以提供群发的功能,这就象传统的电子邮件一样。[JPO 1.6.20]

  The message body
  一个信息总是用元素来包含其具体内容的。[JPO 1.3.3.1]
当然也可以包含可选的元素,它将提供HTML格式的信息。[JPO 1.3.3.3]但是需要注意的是,这个格式是基于XHTML的(w3.org制定的一种由HTML向XML过渡的格式)。

  对于HTML的使用者来说,会发现XHTML与其有很大的不同,因为设计XHTML时就考虑了客户端类型的限制(譬如说手机),具体体现为缺少一些常用的HTML元素,如及,但它们在XHTML中都有等价替代元素,如代替了旧的,但一般指定色彩或格式时,都使用CSS(Cascading Style Sheet)。

  Jabber支持加密的信息传送,它使用包含jabber:x:encrypted命名空间的元素来处理。[JPO 1.6.19]文档中对这段描述并不是很清楚,因此WellJabber并没有对加密提供支持。

  Other types of content
  与MIME不同,jabber信息并没有一个标准的格式来容纳图片或声音,这就意味着你无法在信息中包含一幅图片的数据,除非是使用超链接的形式来指示它。

  你可以随信息一起发送文件,但是文件的数据不能包含在中,而是采用超链接的方式指明可以下载的文件。

  Message types and threads
  发送的信息可以使用”type”属性来提示其显示方式,如果没有指明这个属性,信息将独立地显示在单独的窗口中。若”type=chat”则指明应使用one-to-one(类似QQ的两人世界)聊天界面来显示。此外还有”type=groupchat”,详细参见[JPO 1.3.1.1——1.3.1.4]。
  
  最后有可能出现”type=error”这样的属性值,它表明在发送一个信息时出错了(比较常见的是,发送信息给一个不存在的jabber地址)。这时的回应包含在一个元素中。[JPO 1.3.1.3]

  为帮助客户端显示信息在相应界面中,信息还可以包含一个元素,它包含一个指向信息流的唯一值,客户端发送的第一个信息就应该包括一个唯一的线程ID,而后继的信息都应该发送到此线程ID标识的同一个线程中。(JPO建议thread ID由发送者的jabber ID及当前时间以散列算法合成)

  Message event
  信息的发送者可以使用jabber:x:events命名空间来接受这样的通告,即信息的接收者是否已经查阅过本信息,或者他/她是否在进行回复。这是个全新的功能,在演示程序WellJabber中没有体现。

  Message expiration
  信息的发送者可以使用jabber:x:expire命名空间来确定信息的发送时效。[JPO 1.6.22]如果信息是离线存储的,当时效过去时,即使对方用户登录,该信息也不会发给他/她。

  
聊 天
  
  Jabber的群组聊天或会议机制允许多人同时进行交流。

  这种多人交流的方式在客户端实现时是比较复杂的,这是大家所公认的,因为有两套聊天协议在使用。群组聊天是最早采用的,而会议机制是新的,也更灵活(注意,现在只有jabber 1.4服务器版本才支持它——做为一个外接模块)。实际上,协议本身仍在不段变化,还没有最终形成标准。

  Creating a chat room
  在产生一个聊天室前,你需要有一个聊天室名和一个会议服务。服务可以由用户来制定,或者通过发送jabber:iq:browse请求来检索。聊天室名称可以自己输入,或者编程产生(比如,产生一个随机的数字作为名称)。

  为确认聊天室名称是否已被使用,可以发送(含xmlns=”jabber:iq:browse”的命名空间)到聊天室,如果它不存在,你会收到error 404(没有找到)错误,反之,如果其已存在,你就得重新为聊天室取个名称。QQ中体现在自建聊天室这个版块。

  对于如何生成一个聊天室,有着不同的异议。编程者的实践经验是先发送presence到聊天室,如果已存在就加入它,没有则发送set请求来建立它(发送包含xmlns=”jabber:iq:browse”的命令)

  Joining a chat room
  需要加入一个聊天室时(它的ID已经由用户指定或在接到聊天邀请时确定),首先发送一个元素。注意不要添加resource名在发送中,这是老的groupchat的做法,现在的conference已经不采用了。如果你需要向下兼容性,可以发送resource name。

  接下来,发送包含xmlns=”jabber:iq:browse”的,这个请求包含了一个或多个元素,它指明了你希望加入的会议的别名。一旦你接到一个成功回应,也就意味着你已经加入这个聊天室。

  The chat’s roster
  每个聊天室都有个人员列表,表明当前在聊天室中的人员。它会随着人员加入或离开而改变。

  通知客户端聊天室人员的方法有很多种。首先,发给每个成员元素,在你加入这个聊天室或有其他成员改变在线状态时(更新状态、信息或是离开)。

  此外,当成员列表改变时,自己会收到一个含有jabber:iq:conference命名空间的元素,它具体包括代理服务器上的jabber ID以及当前成员的昵称。描述conference本身的是包含多个属性的元素,如果包含子元素,则标识了当前的成员们,这时通常带有”jid” 属性和”name”属性。

  又如,当一个成员加入、离开或是改变其昵称时,你就会收到一个类似的请求,它包含一个单独的元素。
  
  最后,服务器会发送一个类似“某某加入了”或“某某离开了”样式的消息。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126322/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-126322/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值