您好, , 海量一手媒体资源,专业、正规、高效,为企业提供一站式营销推广服务!
温馨提示
运营小帮手
一站式互联网营销服务平台
  全国免费咨询热线
0755-23071973
运营小帮手
软文发稿
PC端 选择媒体
更方便、更快捷!
查看媒体价格
软文发布、软文代写、百科制作、问答营销、微信营销、微信营销
查看媒体价格
当前位置: 运营小帮手首页 > 新闻中心 > 文章正文

iOS XMPP:了解XMPP协议(二)

XMPP是Extensible Messaging and Presence Protocol的缩写!

XMPP 是一组基于 XML 的技术,用于实时应用程序。最初,XMPP 作为一个框架开发,目标是支持企业环境内的即时消息传递和联机状态应用程序。当时的即时消息传递网络是私有的,非常不适合企业使用。例如,AOL Instant Messenger 不能针对公司内的安全通信进行调整。尽管存在一些商业解决方案,但它们固定的特性集通常不能进行调整,以满足组织的特殊需求。XMPP,当时名为 Jabber,允许组织构建自己的定制工具来促进实时通信,并允许安装现成的第三方解决方案。

顾名思义,XMPP 可用于满足广泛的、对时间敏感的特性要求。实际上,Google Wave,一个大型多用户协作环境,将 XMPP 作为其联合协议的基础。尽管 XMPP 的出现是为了满足 “个人-个人” 即时消息传递的要求,但它完全不必局限于此任务。

要促进消息传递,每个 XMPP 客户端用户必须拥有一个全局惟一标识符。基于历史原因,这些标识符称为 Jabber IDs,或称为 JIDs。鉴于这个协议的分布式特征,重要的是 JID 应包含联系用户所需的所有信息:不存在将用户链接到他们连接到的服务器的中央知识库。JID 的结构类似于电子邮件地址(但不要求 JID 同时也是有效的电子邮件收件人)。

JIDs 还拥有连接到它们的资源。这允许在一个 XMPP 实体标识符之外进一步处理细粒度;例如,尽管上面的示例总体上能够表示 John Doe,但这些资源可以采用任意用户定义的名称,一个 XMPP 实体可以拥有任意数量的资源。除了可以是上下文依赖的外,它们还可以绑定到设备、工具或工作站。对于您的 Pingstream 示例,web 站点的每个访问者都将作为同一个用户登录 XMPP 服务器,但他们拥有不同的资源。

使用 XMPP 的实时消息传递系统包含三大通信类别:

这三种类型的 XMPP 节都拥有以下公共属性:

  • from:源 XMPP 实体的 JID;

  • to:目标接收者的 JID;

  • id:这次对话的可选标识符;

  • type:节的可选子类型;

  • xml:lang:如果内容是人们可读的,则为消息语言的描述。

例如,清单1展示了一个 stream 元素,它建立了从客户端到服务器的通信。建立从客户端到服务器的通信的 stream 标记:

<stream:streamfrom="[server]"id="[uniqueIDoverconversation]"xmlns="jabber:client"xmlns:stream="http://etherx.jabber.org/streams"version="1.0">

一旦通信建立,客户端就能使用 message 元素将消息发送到另一个用户,message 元素包含以下任意子元素:

  • subject:一个可读的字符串,表示消息主题。

  • body:一个可读的字符串,表示消息体。如果每个消息体标记都拥有一个不同的 xml:lang 值,那么可以包含多个消息体标记。(xml:lang 是惟一可能的属性。)

  • thread:一个惟一标识符,表示一个消息线程。客户端软件可以使用这个子元素将相关消息串联在一起。

<messagefrom="sendinguser@somedomain"to="recipient@somedomain"xml:lang='en'><body>Bodyofmessage</body></message>

信息/查询节拥有广泛的功能。一个例子就是 “发布-订阅” 模型,在该模型中,发布者通知服务器某个特定资源进行了更新,服务器则通知已选择订阅这些通知并拥有适当授权的所有 XMPP 用户。

<iqtype="set"from="hamlet@denmark.lit/blogbot"to="pubsub.shakespeare.lit"id="pub1"><pubsubxmlns="http://jabber.org/protocol/pubsub"><publishnode="princely_musings"><item><entryxmlns="http://www.w3.org/2005/Atom"><title>Soliloquy</title><summary>Tobe,ornottobe:thatisthequestion:Whether'tisnoblerinthemindtosufferTheslingsandarrowsofoutrageousfortune,Ortotakearmsagainstaseaoftroubles,Andbyopposingendthem?</summary><linkrel="alternate"type="text/html" target='_blank' target='_blank' href="http://denmark.lit/2003/12/13/atom03"/><id>tag:denmark.lit,2003:entry-32397</id><published>2003-12-13T18:30:02Z</published><updated>2003-12-13T18:30:02Z</updated></entry></item></publish></pubsub></iq>

<iqtype="get"from="boreduser@somewhere"to="friendlyuser@somewhereelse"id="publicStuff"><queryxmlns="http://jabber.org/protocol/disco#items"/></iq>

<iqtype="result"from="friendlyuser@somewhereelse"to="boreduser@somewhere"id="publicStuff"><queryxmlns="http://jabber.org/protocol/disco#items"><itemjid="stuff.to.do"name="Thingstodo"/><itemjid="stuff.to.not.do"name="Thingstoavoiddoing"/></query></iq>

联机状态信息包含在一个联机状态(presence)节中。如果 type 属性省略,那么 XMPP 客户端应用程序假定用户在线且可用。否则,type 可设置为 unavailable,或者特定于 pubsub 的值:subscribe、subscribed、unsubscribe 和unsubscribed。它也可以是针对另一个用户的联机状态信息的一个错误或探针。

  • show:一个机器可读的值,表示要显示的在线状态的总体类别。这可以是 away(暂时离开)

  • chat(可用且有兴趣交流)、dnd(请勿打扰)、或 xa(长时间离开)。

  • status:一个可读的 show 值。该值为用户可定义的字符串。

  • priority:一个位于 -128 到 127 之间的值,定义消息路由到用户的优先顺序。如果值为负数,用户的消息将被扣留。

  • <presencexml:lang="en"><show>chat</show><status>Boredoutofmymind</status><priority>1</priority></presence>

    <presencetype="probe"from="friendlyuser@somewhereelse"to="boreduser@somewhere"/>Boreduser@somewhere'sserverwouldthenrespondwithatailoredpresenceresponse:<presencexml:lang="en"from="boreduser@somewhere"to="friendlyuser@somewhereelse"><show>chat</show><status>Boredoutofmymind</status><priority>1</priority></presence>

    另一种可能性就是将状态值用作每用户应用程序状态数据的携带者。尽管此规范将状态定义为可读,但没有什么能够阻止您在那里存储任意字符串来满足您的要求。对于某些应用程序而言,它可以不是可读的,或者,它可以携带微格式形态的数据负载。

    阅读到此,应该对XMPP协议有所了解了。我们需要掌握文中所提到的节点名称,每个节点所对应的功能。

    猜您可能需要的服务: