即时聊天IM之一 XMPP协议简述

合肥程序员群:49313181。    合肥实名程序员群:128131462 (不肯透露姓名和信息者勿加入)
Q  Q:408365330     E-Mail:egojit@qq.com

 综述:程序员

以前小规模的IM一直经过百度云推实现模拟IM,这种局限性比较多。公司不少的项目都须要IM集成,因此最终想一想仍是本身搭建XMPP服务器来实现IM功能。这样可控性比较强。能够实现各类需求,首先就有必要学习XMPP协议。了解XMPP基础协议的状况下才能更好的使用smack库,已经自定义各类扩展。安全

XMPP简介:服务器

XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议) 它是一种基于XML基础上实现的一种协议,是聊天通信的一个标准协议。Jabber最先实现XMPP协议的。首先咱们知道XML格式扩展性比较强,并且它又具备HTML这种穿透防火墙的功能,因此不易被防火墙拦截,所以在此基础上的XMPP协议固然也具备这些特性,另外XML是和平台无关的,实现多平台数据交换没有任何问题,XMPP确定也是如此。网络

XMPP协议特色:架构

1.XMPP协议系统是一个分布式的系统,每台服务器能够控制本身的系统资源,另外一方面它也能够实现系统间资源交换。XMPP服务器利用开放的XML协议来进行S2S(Serverto Server)通讯,就像在C2S(Client to Server)同样。相比之下,大多数的IM系统使用了只是支持C2S/S2C通讯的协议,所以Jabber/XMPP服务器具备更大的灵活性。分布式

2.XMPP协议是公开的非私密的,不少程序是开放源代码。XMPP协议客户端和服务器端的交互要经由XML流。普通的聊天消息类型(message),改变用户登陆状态(presence),传递消息内容或查询/更新(info/quey)应用是经过命名XML的命名空间(namespace)创建的。ide

3.状态(Presence)在整个聊天连接中都是维持存在的,XMPP协议有在网络中维持存在和可用信息的能力。模块化

4.XMPP容许创建并行的TCP套接字链接对全部链接上的客户端和服务器端。一旦创建链接,会一直维持。由于连接一直保持着,那么 设置、用户认证、用户登陆状态查找功能都不用每次都重复执行。post

5.Jabber/XMPP系统是模块化的,Jabber/XMPP的设计注重如何实现可伸缩性、安全性以及扩展性。学习

 XMPP协议的解析:

在XMPP协议中一直存在着三个关键点和角色,服务端,网关以及客户端(手机,pc,平板……),咱们这里所讲的架构都是服务端/客户端模式,而非客户端直连

1.消息解析:

Jabber/XMPP系统经过XML流传输数据,XML从客户端到服务端或者XML流从服务端到客户端。这种XML流有三个顶层XML标签元素:<message/>,<presence/>和<iq/>,固然每一个标签都包含子标签元素和属性,下面将描述这些元素:

  一>.消息标签元素<message/>:

  IM最基本的功能就是用户之间进行聊天消息发送,这个元素就是承担着这种功能。每一个message都有多个属性"from"属性和"to"属性就是其中两个,顾名思义就是信息谁发的,又是发给谁,也就是发送人地址和接收人地址。消息还有"type"属性,标志消息类型,这些都有固定的类型,固然消息也有固定的身份id属性,这个id标志每一天消息,这是惟一区分消息的。

  二>用户状态元素<presence/>:

  用户登陆后能够是:在线的available,隐身的Hide,又或者是离线的unavailable。用户登陆上线后服务器会把消息发送给用户,若是用户不在线,那么服务器会把消息存储起来,这样能够实现离线消息。<presence/>元素包含<show/>和<status/>两个元素,<show/>子元素是描述<status>的.

Presence主要有两个用途: 1)告诉服务器全部客户端当前所处的状态,2)发出添加/删除好友请求.

Presence.Type枚举值以下:

  • available: 表示处于在线状态
  • unavailable: 表示处于离线状态
  • subscribe: 表示发出添加好友的申请
  • subscribed:表示好友请求确认
  • unsubscribe: 表示发出删除好友的申请
  • unsubscribed: 表示拒绝添加对方为好友
  • error: 表示presence信息报中包含了一个错误消息。

 

 

 三>消息/查询元素<iq/>

  Jabber/XMPP协议的最后一个订层元素就是<iq/>元素。Info/Query的缩写就是iq 顾名思义就是信息/查询,经过这个元素能够获取各个端之间的消息,它是请求响应的也就是查询反馈模式。每一个iq的目的都是不一样的,它们经过命名空间namespace来区分。iq也有"from" "type" "id" 三个属性,type属性和http协议差很少有get 和post值.每个IQ-get 或IQ-set 节均必须接收响应的IQ-result 或IQ-error 节。经过这种查询/反馈结果的方式客户端和服务器通讯

相关文章
相关标签/搜索