xmpp如何与服务端通信修改xmpp的域

2065人阅读
本人原创,更多xmpp知识、ios知识、其他分享知识见:
1、XMPP是可扩展消息与存在协议,主要用于im。
2、他是一种类似于http协议的数据传输协议,过程如:“解包装—&包装”过程。
3、在XMPP中,有三个角色:客户端,服务器,网关。 &在三者之间可以进行任意两两通信。服务器承担客户端信息记录,连接管理和信息的路由功能。网关承担与异构即时通信系统的互联互通。
4、XMPP的基本网络形式是单客户端通过TCP/IP连接到单服务器,然后传输XML。
5、他是基于C/S结构的,分布式网络,使用xml的数据格式。
6、XMPP的核心部分是由他的节构成的。
7、xmpp网络:服务器,客户端,组件,插件。
8、xmpp的jid与电子邮件地址类似。节点、域、资源。
9、xmpp主词汇表有3种节:&message&(用于在实体间交换“发后不管”消息)&presence&(传达出席状态变化并用来操纵出息订阅)&iq&(提供类似http的get和post操作的请求响应语义。).
10、xmpp会话:连接、流的建立、身份验证、会话正文、断开连接。
基本工作原理:
从一个client到另一个client的jabber消息和数据都要通过xmpp server。
1.client连接到server。
2.server 利用本地目录系统的证书对其认证。
3.client制定目标地址,让server告知目标状态。
4.server查找,链接并进行相互认证。
5.client间进行交互。
核心节:&message&&presene&&iq&
1、&stream& &xmpp以其标记开始。
2、&presence&用来表明用户状态。可以来广播或“发布-订阅”;&status&网络状态、&show&可用状态、&priority&资源优先级。
3、&iq&一种请求/响应机制。
4、&message&用于两个jabber用户发送消息。&body&是消息内容;他包含&subject/&(消息标题)&body/&(消息内容)&thread/&(跟踪会话线索)子标签。
简单会话:
&stream:stream& & &创建一个xmpp流
&iq type=’get’& & &请求elizabeth的花名册,也就是她的所有已存储的联系人列表。
&query xmlns=’jabber:iq:roster’/&
&presence/& & & & & & & 通知服务器她已经在线并可以访问。 &当他注意到darcy在线的时候,就会发个message节,
&message&to=’darcy@pemberley.lib’
from=’ellizabaeth@longbourn.lit/ballroom’
type=’chat’&
&body&sdf&/body&
&/message&
&presence type=’unavailable’/& &告诉服务器,这是不可访问的要关闭
&/stream:stream&
支持通用属性:from,to,type,id。
识别此节的起始jid。这里不建议在输出的节上手工设置from属性,服务器会在这些节通过时添加正确的from属性,而如果错误地设置from属性会导致服务器拒绝整个节。
客户端-服务器中,接收到的节上没有from属性,意味着该节来源于服务器自身,而在服务器-服务器中,缺少from被视为是错误。
把xml节发送到to属性指定的jid。他和from相似。
客户端-服务器流中没有to属性,那么服务器将假设它是有意发给服务器自身的消息,建议在向服务器自身发消息时忽略to。
如果to属性中指定的jid是一个用户,那么服务器有可能代表用户来处理该节。
如果目的地是一个裸jid,那么服务器将处理这个节。
如果目的地是一个完整的jid,那么服务器将直接把该节路由到该用户。
这个属性指定了三个节的具体类型。
三个节都可以把type设置为error,表示这个节是对已接收到的同一类型的节的错误影响,不要响应类型为error的节,避免在网络上出线反馈环节。
给节指定id来辅助识别响应。对于iq节,id是必须的,但是对于其他的节id是可选的。如果某个节是为了响应一个携带id属性的节而产生的,那么这个应答必须包含携带相同值得id值。
id必须具有唯一性,这样节的发送者就可以使用它来甄别响应了。最简单的做法就是让id属性值在给定的流中保持唯一性,以免歧义。
在message和presence节的应答节一般仅限于报告错误,iq的应答节可以用来通知成功操作、确认命令或返回请求的数据。无论如何客户端都可以使用应答节的id属性来识别与该节相关联的请求节。 & 在短时间内发送大量同类型的节,此时这个功能就非常关键了。因为这些节的应答可能会以乱序形式到达。
1)、presence
他控制并报告实体的可访问性。(包括:在线,离线; &离开,请勿打扰等。 &) 他还可以用来建立和终止向其他实体发布出席订阅。
有了出席订阅通知,我们在即时通信系统中就可以在发送消息之前知道接收者是否在线。
(1)、普通的presence
此时他是不包含type属性的,如果有的话他的属性值为unavailable活着error。 &在这里,type属性是没有available值得,因为我们可以通过缺省的type来设定。
用户可以通过发送不携带to属性,并直接发往服务器的presence节来操纵出席状态。如下:
&presence/& & & &前两个节将用户的出息状态设置为在线和离线
&presence type=‘unavailable’/& & 离线
&presence&
&show&away&/show& & & &只能用在presence中,值away离开,chat聊天,end不希望被打扰,xa长期离开, &传达用户可访问性的性质,它请求接收者的客户端使用这个消息来更新发送者出息状态的可视化指示器。
&status&sf&/status& & 一个人们可读的字符串,用户可以将其设置为能够传达出席信息的任何值。 &聊天时,接收者的客户端中这个字符串一般紧挨着联系人名字显示。
&/presence&
&presence&
&status&sfdf&/status&
&priority&22&/priority& & &优先级 &同时具有多个回话的用户可以使用优先级来指出哪一个资源应该接收到那些发往该用户裸jid的聊天消息。
&/presence&
&presence&
&prioriry&11&/pritority&
&/presence&
(2)、扩展presence
比如将你正在听歌,心情等信息广播给其他联系人。这里用流量较大。
(3)、出席订阅
server会自动将出席信息广播给联系人,用户也会从所有他已经进行出席订阅的联系人那里接收到出席的状态更新。
对于好友状态的订阅:A订阅了B得出席信息,这里并不是说B也订阅了A得出席信息。
订阅状态:subscribe(建立订阅),unsubscribe(取消订阅),subscribed(应答建立),unsubscribed(应答取消)。
&presence from=‘a@longbourn.lit/outside’ to=‘b@pemberley.lit’ type=‘subscribe’/&
&presence from=‘b@pemberley.lit/library’ to=‘a@longbourn.lit/outside’ type=‘subscribed’/&
&presence from=‘b@pemberley.lit/library’ to=‘a@longbourn.lit’ type=‘subscribe’/&
&presence from=‘a@longbourn.lit/outside’ to=‘b@pemberley.lit/library’ type=‘subscribed’/&
(4)、定向出席
他是一种直接发给另一个用户或其他某个实体的普通presence节。这里可以用来向那些没有进行出席订阅的实体传送出席状态信息。也就是临时出席。
这里当发送者变成不可访问的状态的时候,出席信息的接收者将会自动得到通知,即使发送者忘记显示的通知接收者。这里可以使用定向出席来临时地掌握某个用户的可访问性。
2)、message
从一端到另一端发送消息。这个节属于发出后不再过问,可靠性不能保证。一旦消息发出去了,发送者就不会知道他是不是传送出去了,也不会知道到达的时间。
message示例:
&message from=‘a@netherfield.lit/frawing_room’ to=‘b@pemberley.lit’ type=‘chat’&
&body&adf&/body&
&/message&
benlent夫人向聊天室bennets@chat.merython.lit发送消息,bennet接收消息
&message from=’bennets@chat.merython.lit/mrs.bennet’ to=‘mr.bennet@longbourn.lit/study’ type=‘groupchat’&
&body&df&/body&
&/message&
(1)、消息类型
type指出:chat(一对一聊天),error,normal,group chat(多人聊天),headline(不支持或者不方便应答的自动化服务使用)。
type是可以省略的,默认为normal,但是我们应该提供一个type值,
(2)、消息内容
&body&元素包含着该消息中人们的可读的内容。只要有不同的xml:lang属性就可以使用多个&body&。
&thread&元素用来创建线索,他的内容是一个用来区分不同线索的唯一标识符。应答节应该包含与所应答的节相同的&thread&元素。 (线索:向电子邮件一样)
在消息中,可以使用XHTML-IM来给消息提供格式化,超链接,以及富媒体。也可以使用Chat State Notifications来允许用户通告对方自己正在撰写消息或有空。(qq的正在输入)
这个节表示的时info/query(信息与查询),他给xmpp童心提供请求和响应机制。和http的基本工作原理想死,允许获取和设置查询。(get 和 post)
每个节都需要有一个响应,但是这个节的必须的id将用来把响应与导致该响应的请求关联起来。
type:get,set请求节; result,error为响应节。
下面看示例,每个iq节必须匹配id属性
a向服务器发送了一个格式错误的花名册请求
&iq from=a@longbourn.lit/garden’ type=‘get’ id=‘roster1’&
&query cmlns=‘jabber:iq:roster’/&
&iq to=‘a@longbourn.lit/garden’ type=‘error’ id=‘roster1’&
&query xmlns=‘jabber:iq:roster’/&
&error type=‘cancel’&
&feature-not-implemented xmlns=‘urn:ietf:params:xml:ns:xmpp-stanzas’/&
&iq from=a@longbourn.lit/garden’ type=‘get’ id=‘roster2’&
&query cmlns=‘jabber:iq:roster’/&
&iq to=‘a@longbourn.lit/garden’ type=‘result’ id=‘roster2’&
&query xmlns=‘jabber:iq:roster’&
&item jid=‘b@longbourn.lit’ name=‘b’/&
&item jid=‘c@netherfield.lit’ name=‘c’/&
a将b添加到花名册,回复空白iq来应答成功。
&iq from=‘a@longbourn.lit/garden’ type=‘set’ id=‘roster3’&
&query xmlns=‘jabber:iq:roster’&
&item jid=“b@pemberley.lit’ name=‘b’/&
&iq to=‘a@longbourn.lit/garden’ type=‘result’ id=‘roster3’/&
在错误提示节中,必须将type设置为error,并且需要携带一个&error&子元素。
在error中,他的type类型为:cancel(不应该重试),continue(警告信息),modify(发送的数据需要一些修改才可以被接受),auth(通知实体在以某种方式进行身份验证之后重试),wait(报告server临时遇到问题,稍后重发)。
在&error&中,必须包含一个错误条件作为他的子元素,也可以在&error&元素的子元素中指定应用程序的特定错误条件。还可以包含一个&text&元素来进一步指出有关该错误的详细信息。
要注意的是每个错误条件元素都必须位于urn:ietf:params:xml:ns:xmpp-stanzas命名空间里。
&error type=‘cancel’&
&not-allowed xmlns=‘urn:ietf:params:xml:ns:xmpp-stanzas’/& &这里指出了一般性故障
&closed-node xmlns=‘http:/jabber.org/protocol/pubsub#errors’/& &给出了请缺德应用程序错误提示信息
&text xmlns=‘urn:ietf:params:xml:ns:xmpp-stanzas&dfs&/text& & 包含了问题描述
XMPP寻址:
xmpp网络有一个或多个地址jid, &a@aaa.llit& &组成:节点、域、资源(带有资源的jid是完整jid,没有资源的jid是裸jid),其中节点和资源是可选的,域是必选的。
其中域是服务器等的可解析dns名称。只有域组成的jid是有效的地址,表示服务器的地址。
其中指向域的节将由服务器自身处理,并且可能被路由到其他的组件或者插件上。
在本地时我们通常会识别域中的一个特定的用户,它位于@之前,本地部分还可以用来识别其他对象,多人聊天服务将每个聊天室显示为一个jid,节点部分指向聊天室。
jid的资源部分会标识一个特定的客户端xmpp链接,对于xmpp客户端来说,每个链接均被指派一个资源,如 用 &&a@aaa.lit/study和a@aaa.lit/library& 来寻址,其中资源部分也可以用来识别其他对象,在多人聊天时,jid的资源被用来识别聊天室中的一个特定的用户。
客户端处理裸jid的时候,服务器自己将处理发往客户端裸jid的节。如:一条发往某个客户端的裸jid的消息将被转发到该用户的一个或多个已连接资源,如果该用户离线,那么就将该消息存储以后传送。但是发给完整jid的节通常会直接路由到该资源所在的客户端连接。可以将裸jid视为寻址用户的账户,而不是寻址该用户的某个已连接的客户端。
xmpp连接:
连接,流的建立,身份验证以及断开连接。
发送节前要建立xmpp流,在流存在之前要建立通往xmpp服务器的连接。
客户端和服务器利用域名系统将服务器的域名解析成一个能够连接的地址。电子邮件服务特别的使用邮件交换台记录来提供处理特定域邮件的服务器列表。这样一个知名服务器地址就不用处理每一项服务请求了。电子邮件在dns中有特殊的对待。现在服务记录srv可用来为任意服务提供类似的功能。
当xmpp客户端或服务器连接到另一个xmpp服务器的时候,首先要在服务器域中查询适当的srv记录。查询应答中可能包含多条srv记录,这样就可以在多台服务器间建立负载均衡链接。
当没有找到合适的srv记录的时候,应用程序试着直接连接到给定域。大多数库也可以显式制定要连接的服务器。
2).流的建立
向服务器发送起始元素&stream:stream&,就可以打开xmpp流。服务器通过发送响应流的起始标记&stream:stream&进行响应。
服务器先发送&stream:features&元素,详细列举xmpp流中支持的所有功能。这些功能大多数与可用的加密和身份验证选项有关。
客户端发给服务器
&?xml version=’1.0′?&
&stream:stream xmlns=’jabber:client’
xmlns:straem=’http://ethrx.jabber.org/streams’
version=’1.0′
to=’pemberley.lit’&
服务器应答
&?xml version=’1.0′?&
&stream:stream xmlns=’jabber:client’
xmlns:stream=’http://etherx.jabber.org/streams’
version=’1.0′
from=’pemberley.lit’
id=’dddd’
xml:lang=’en’&
&stream:features&
&stream:freatures&
&starttls xmlns=’urn:ietf:params:xml:ns:xmpp-tls’/&
&compression xmlns=’http://jabber.org/features/compress’&
&method&zlib&/method&
&/compression&
&mechanisms xmlns=’urn:ietf:params:xml:ns:xmpp-sasl’& & & & & & & & & & & &mechanism&DIGEST-MD5&/mechanism&
&mechanism&PLAIN&/mechanism&
&/mechanisms&
&/stream:features&
根据数据交换信息指导pemberley.org服务器支持TLS,流压缩zlib等。
在两台服务器间建立xmpp流的过程相同,但是 jabber:client换成 jabber:server才可以。
3).身份验证
xmpp可以进行tls传输层安全加密,并且大多数客户端默认使用。服务器支持tls加密后,客户端就会启动tls链接,并将当前套接字升级为一个加密套接字。创建一对新的xmpp流。
xmpp身份验证使用sasl 简单身份验证与安全层协议,并支持多种身份验证机制。服务器通提供明文验证和基于md5摘要的验证,但是某些服务器还支持通过kerberos或特殊令牌来验证。
完成身份验证后,客户端必选为该链接绑定一个资源并启动一个会话。如果用户正在线路上查看xmpp流量,就会看到&bind&&session&元素被发送出去。(在&iq&中) &如果客户端没有提供绑定的资源,那么服务器将为其选定一个。
当两台服务器相互连接的时候,服务器交换并验证tls证书,或者接受服务器使用某种回拨协议通过dns来验证发送者身份。
4).连接断开
当用户结束xmpp会话的时候,他们终止会话并断开连接。最有礼貌的终止会话的方式是:先发送无效出席信息,然后关闭&stream:stream&元素。
通过发送最后的无效出席信息,用户的联系人能够得知该用户离开的原因。
&presence type=’unavailable’/&
&/stream:stream&
然后,服务器终止发往客户端的流。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:124103次
积分:2303
积分:2303
排名:第8582名
原创:83篇
评论:108条
(4)(1)(7)(1)(2)(3)(5)(4)(11)(9)(27)(9)基于xmpp企业级即时通信系统的研究与实现 ...
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于xmpp企业级即时通信系统的研究与实现
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口这里让你很好的理解XMPP流程
XMPP 是面向基于 XML 的 Internet
通信的开放协议。尽管它是非常受欢迎的即时消息传递协议,但您还可以把它当作一个通用的消息传递服务使用。了解 XMPP
的详细内容以及如何使用它进行简单的消息传递。
顾问工程师,  
2009 年 11 月 02 日
即时消息传递(IM)在临时 Internet
用户和业务用户中都是一个受欢迎的应用程序。它不仅为用户提供了与他人进行实时通信的方法,还能够得到他们的到场信息(在线、离开、离线,等等)。Jabber
是最早的开放 IM 协议之一,由 Jeremie Miller 开发并于 1998 年作为一个非标准 IM 协议出现。由于
Jabber 是使用 XML 创建的可扩展协议,它很快就创建了其他可用作通用传输或面向消息的中间件(MoM)的应用程序。最终由
Jabber 产生了 XMPP,这是一个 IETF 工作组协议文档形式的基于标准的协议:RFC
3920,“可扩展消息传递和到场协议(XMPP)”。
常用缩略语
API:应用程序编程接口(Application programming interface)
EVA:舱外活动(Extra Vehicular Activity)
IETF:Internet 工程任务组(Internet Engineering Task Force)
HTTP:超文本传输协议(Hypertext Transfer Protocol)
RFC:征求意见文档(Request for comments)
RPC:远程过程调用(Remote procedure call)
SMTP:简单邮件传输协议(Simple Mail Transport Protocol)
SOAP:简单对象访问协议(Simple Object Access Protocol)
TCP:传输控制协议(Transmission Control Protocol)
URL:统一资源定位符(Uniform Resource Locator)
XML:可扩展标记语言(Extensible Markup Language)
XMPP 并不是惟一的通用消息传递协议。其他受欢迎的协议(如 XML-RPC 和
SOAP)能够为这个功能提供函数调用(如语义)。一些较新的方法,如具象状态传输(ReST),使用 URL
指定位置、对象和方法,提供受控制的文件访问。
与其他的应用层协议(如SMTP)有着相似之处。在这些架构中,具有惟一名称的客户机通过相关的服务器与另外一个具有惟一名称的客户机进行通信。每个客户机执行客户机的协议表单,而服务器在表单中提供路由功能。&说明了这个简单的架构。在这个例子中,每个客户机都是同一个域名(discovery.nasa.guv)的一部分。
图 1. 由一个服务器和两个客户机组成的简单的 XMPP 架构
服务器还可以针对不同域之间(例如,在 discovery.nasa.guv 和 europa.nasa.guv
之间)的路由进行通信。此外,网关可用于在外部消息传递域和协议之间进行转换。&中的示例显示了一个 XMPP 网络,网关通往一个短信服务(SMS)域和一个 SMTP
域。在这种情况下,网关大多数都是被用来在 IM 协议(例如,在 XMPP 和 Internet
中继聊天(IRC))之间进行转换。作为一个可扩展的协议,XMPP
对于在不同的端点协议间提供统一连接性来说是一个理想的中枢协议。XMPP
网关允许终止一个给定的客户端到服务器的会话,并且向目标端点协议发起一个新的会话(同时进行必要的协议转换)。
图 2. 包含了 XMPP 网关的更为复杂的 XMPP 架构
XMPP 中的地址
XMPP 中的地址(即&Jabber
ID[JID])与标准电子邮件地址相似,但有着几个显著的差别。JID 包含一个可选节点、一个域和一个可选资源:
[ node "@" ] domain [ "/" resource ]
最常见的用法就是定义一个 IM 用户(类似电子邮件地址),比如
DavidBowman@discovery.nasa.guv。用户能够多次登录 XMPP
服务器,而在这个例子中,资源能够表示位置。例如,示例用户可能有一个主终端(DavidBowman@discovery.nasa.guv/terminal)JID
和另外一个来自 EVA pod(DavidBowman@discovery.nasa.guv/eva_pod1)的
JID。因此,能够找到某个特定位置,或离开此位置并找到用户,不管用户在哪个位置登录。
XMPP 是一个相对简单的协议,它通过 XML 消息出现在 TCP 套接字上。异步通信发生在 XML 流中,并带有 XML
节(stanza)。XML
流&是封装了两个实体间的 XML 信息交换的容器。XML
流传递&XML
节,这些 XML 节是一些分散的信息单元。例如,在 XMPP 中使用 XML 节传递消息(IM
用户间的文本)以及到场信息。为说明这些概念,请看一个在两个客户端之间使用 XMPP 进行 IM 通信的简单示例。
&演示了两个实体之间的简单会话。注意,至少有一个服务器会出现在会话中(在这个例子中,因为两个客户端存在于同一个域中,所以准确地说,只有一个服务器)。在&&中,左边的客户端是发起实体(发起两个实体间的
XMPP 通信)。XML 流使用&to&属性来识别接收域(以及定义
XML 名称空间)。右边的接收客户端&接收
XML 流并使用 XML 流响应(在这个例子中,使用&from&属性)进行回应。在这个阶段,可以进行几个不同的协商(如验证和加密)。请忽略这部分讨论(例外情况是当
IM 客户端出现在不同的域中进行服务器到服务器通信)。(请查看。)
图 3. 示例(简化的)XMPP 通信
&中的 XML 流的下一步是进行消息传递。这个通信在消息节中进行,并且包括了源和目标
XMPP 地址(from&和&to)、使用的语言以及节正文中的消息。对方用其自己的消息进行响应,关键区别是源和目标
XMPP 地址。最后,发出流关闭消息(在连接的两端进行)以关闭 XML 流。
任何一边都可能返回一个错误,如下面所定义。在本例中,对方发送了一个无效的 XML 流和节。
尽管这个示例展示了简单的 IM 通信,但很容易就能了解消息节是如何转换成 RPC
消息的,同时负载了来自对等协商的安全问题。您可以把函数注册为节点,以创建一个动态的 Web
服务框架,而不是对域中的用户进行注册。现在让我们看一下如何创建一个在 XMPP 中通信的简单应用程序。
使用 Ruby 的 XMPP 示例
选择 XMPP 库
XMPP 其他有趣方面的其中之一就是您可以在大量的库中进行选择,包括各种各样的语言。这个示例使用了 Ruby 语言和 XMPP4R
库。要获取现有的各种库的链接,请查看&。
通过库来演示 XMPP,探究用作技术字典的简单 IM 代理的开发。使用这种方法,您通过一个标准的即时消息程序输入一个词时,IM
代理将返回它的定义。
本示例实现了可以通过 XMPP 连接到其他 IM 代理的 IM 代理,并且一旦连接成功,将解释词语的定义。&提供了简单的 XMPP 代理。
清单 1. 用于文字定义的简单 XMPP 代理
require 'xmpp4r/client'
# Create a *very* simple dictionary using a hash
hash['ruby'] = 'Greatest little object oriented scripting language'
hash['xmpp4r'] = 'Simple XMPP library for ruby'
hash['xmpp'] = 'Extensible Messaging and Presence Protocol'
# Connect to the server and authenticate
jid = Jabber::JID::new('bot@default.rs/Home')
cl = Jabber::Client::new(jid)
cl.connect
cl.auth('password')
# Indicate our presence to the server
cl.send Jabber::Presence::new
# Send a salutation to a given user that we're ready
salutation = Jabber::Message::new( 'hal@default.rs', 'DictBot ready' )
salutation.set_type(:chat).set_id('1')
cl.send salutation
# Add a message callback to respond to peer requests
cl.add_message_callback do |inmsg|
# Lookup the word in the dictionary
resp = hash[inmsg.body]
if resp == nil
resp = "don't know about " + inmsg.body
# Send the response
outmsg = Jabber::Message::new( inmsg.from, resp )
outmsg.set_type(:chat).set_id('1')
cl.send outmsg
&首先创建了一个简单的字典。为此,您可以使用 Ruby
中的&hash&类,它允许您创建键值对(类似于数组),但是随后可以轻松地通过键引用它们。接下来,使用
XMPP4R 库连接到服务器。首先使用&Client&类创建一个
JID 和一个新的客户端连接。要真正连接到 IM 服务器,请使用&connect&方法。一旦连接上了,您可以使用密码来调用&auth&方法。现在,连接已经可以用来传递消息了。
下一步(可选)是表示您已经登录了 IM 服务器。为此,需要向服务器发送一个 presence
节。您还可以发送一个可选信息给对方,告诉对方您已在线了。这点可以通过创建一个消息节并使用对方地址和消息对它进行初始化来实现。消息初始化成功后,可以通过对&Client&类实例使用send&方法来发送它。
要对发送给您的消息作出反应,请使用您的客户端连接的&add_message_callback&方法。任何时候消息到达时,都将调用代码块来处理消息。传入消息表示为&inmsg(Message&实例)。首先要进行检查,看看传入消息&body&定义的词是否在您的字典中。如果返回&nil,那么表示没有找到该词,因此您需要提供一个默认的响应。使用传入消息(inmsg.from)和响应字符串创建一个新的消息。初始化完成后,通过客户端实例把新消息发送给发送方。
&显示了应用程序的一次运行。本示例使用了受欢迎的 pidgin
通用聊天客户端。pidgin 客户端支持所有主要的聊天协议,并可以与许多现有的聊天网络一起使用(甚至是同步进行)。&显示了当 IM 代理连接到服务器并与定义用户开始会话时创建的消息传递弹出窗口。
图 4. 使用 IM 代理的示例 IM 会话
这个应用程序原本非常简单,但是 XMPP4R 为其他的功能(如帐户注册、发现、文件迁移、多用户聊天、发布/订阅,甚至
RPC)提供了许多类和方法。您可以在&&中找到一个
“可浏览的” 类 API,它为查看所有的 XMPP4R 文件、类和方法提供了一个方便的方法。
XMPP 的应用
XMPP 为网络中的消息传递提供了一个通用框架。除了传统的 IM 和到场数据分布外,XMPP 还可以用于许多不同用途。
IM 的封闭式应用包括小组或多方消息传递,或开发多用户聊天室。使用多方通信,可以实现与 Twitter
提供的微博客(micro-blogging)类似的功能。但是文本并不是惟一可以通过 XMPP
传送的数据。其他的通信形式包括声音、图片和视频数据。
如今出现了服务发现协议(比如 Bonjour 或 Service Location Protocol),但 XMPP
为网络中的服务发现以及服务与功能的宣传提供了坚实的基础。
在线游戏大量地使用了 XMPP。XMPP
为在线游戏提供了一组关键的功能,包括验证、到场信息、聊天,以及可扩展的游戏状态信息的接近实时的交流。
最后,XMPP
是新的云计算时代的一个完美协议。云计算和存储系统依赖不同层次和形式的通信,不仅包括在系统间进行消息传递以中继状态,还包括较大对象(如存储或虚拟机器)的迁移。通过结合身份验证和传输中的数据保护,XMPP
可以应用在不同的层次,而且可以作为一个理想的中间件协议。
在此请注意,大多数应用与人类通信没有任何的关系,而是关系到机器通信(MMI 或机器到机器的通信)。当您发现用于 IM
的协议有着各种各样的用途时,您会觉得这是非常有趣的事情。
多语言的 XMPP
XMPP 是作为一组库实现的,为应用程序提供了 XMPP 能力。从 XMPP 支持众多语言这点就能轻松判断出,XMPP
是一种非常有用的协议。您将发现 XMPP 库软件支持传统语言(如&C&和&C++)以及受欢迎的脚本语言(如
Ruby、Java& 语言、Python、Perl 和 Tcl)。您还将发现 XMPP 库支持其他一些语言,如
Erlang、C#&和
Lisp。因此,不管您在何种环境中,都有可能找到一种 XMPP 库来访问 XMPP。要获得各种 XMPP
库支持的语言列表,请查看&。
不断成长的 ReST
尽管 ReST 是一个架构模型而非实现方法,但它在一些领域中成长得很快。ReST
的用于远程资源管理的简单模型已经存放在了云存储中,在那里,ReST 被用作存储访问和管理模型。
许多有用的技术常常以全新的方式使用,这些方式是技术创建者当初从未考虑过的。例如,HTTP 是服务于 Internet 上的 Web
页面的事实标准协议,但它同时也用作针对 SOAP 和 XML-RPC 等其他协议(包括 ReST
之类的协议模型)的应用层传输。XMPP 是另外一个发掘出除了 IM 外的其他许多新应用的有用技术。您将如何把 XMPP
引用到您的解决方案中呢?
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 如何搭建xmpp服务器 的文章

 

随机推荐