即时聊天IM之一 XMPP协议简述
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)建立的。
3.状态(Presence)在整个聊天链接中都是维持存在的,XMPP协议有在网络中维持存在和可用信息的能力。
4.XMPP允许建立并行的TCP套接字连接对所有连接上的客户端和服务器端。一旦建立连接,会一直维持。因为链接一直保持着,那么 设置、用户认证、用户登录状态查找功能都不用每次都重复执行。
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 节。通过这种查询/反馈结果的方式客户端和服务器通信
即时聊天IM之一 XMPP协议简述的更多相关文章
- 即时聊天IM之三 XMPP协议客户端库的和Android端框架概述
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com smack ...
- 基于XMPP协议的手机多方多端即时通讯方案
一.开发背景 1.国际背景 随着Internet技术的高速发展,即时通信已经成为一种广泛使用的通信方式.1996年Mirabilis公司推出了世界上第一个即时通信系统ICQ,不到10年间,即时通信(I ...
- 基于XMPP协议的Android即时通信系
以前做过一个基于XMPP协议的聊天社交软件,总结了一下.发出来. 设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务 ...
- 即时聊天 / XMPP
MQTT是第二个即时聊天协议(了解) 5.即时通讯 即时通讯网上有第三方的解决方案,比如环信,融云等.我们是自己搭的xmpp服务器,服务器使用的tigase,之前写过相关的博客,自己去年也做了对应的w ...
- 7.xmpp版即时聊天
即时聊天的解决方案 socket: xmpp:xmpp+openfire+asmack 环信 常见协议 比较安全,tcp上还加了俩层 简单聊一下socket socket:套接字,连接需要ip和端口, ...
- 即时通信系统Openfire分析之一:Openfire与XMPP协议
引言 目前互联网产品使用的即时通信协议有这几种:即时信息和空间协议(IMPP).空间和即时信息协议(PRIM).针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)以及XMPP.PRIM与 ...
- iOS:XMPP即时聊天知识
XMPP即时聊天框架:XMPPFramework XMPP The Extensible Messaging and Presence Protocol(可扩展通讯和表示协议). 基于XML XM ...
- .net平台 基于 XMPP协议的即时消息服务端简单实现
.net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...
- iOS和Android使用MQTT协议实现消息推送和即时通讯(替代XMPP,已经有TMS MQTT)
大多数应用都会涉及到即时聊天的功能,在开源方案中有XMPP和MQTT.其中XMPP是基于XML的,并且不支持消息质量QOS, 所以本身并没有消息重传的机制,从而会导致丢消息.而MQTT是基于二进制的, ...
随机推荐
- Linux_用户级_常用命令(5):rm
Linux常用命令第5集包含命令:rm 开篇语:懒是人类进步的源动力 本文原创,专为光荣之路公众号所有,欢迎转发,但转发请务必写出处! 一.命令简介 删除一个目录中的一个或多个文件或目录,如果没有使用 ...
- android源码中,在系统多媒体数据库中增加一个字段
由于项目需求,在系统多媒体管理数据库里的存储图像文件的表中需要新增加一个字段,源码在:项目\packages\providers\MediaProvider\MediaProvider.java下,在 ...
- lua 和 c/c++ 交互 (持续更新)
参考: http://blog.csdn.net/xiaohuh421/article/details/7476485 http://blog.csdn.net/shun_fzll/article/d ...
- tomcat7+jdk1.8一键安装脚本
#!/bin/bash #--------------------------------------------------------------------- # # Author : 大象无形 ...
- 20-ES6(3)class基本语法
# Class基本语法 关于es6的class简介: ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类.基本上,ES6的class可以 ...
- web前端之HTML的大框架(body元素与frameset元素)
web前端之HTML的大框架 body元素与frameset元素 对于从事html的人员来说,我们一般熟悉的框架是先声明html ,然后在<html>标签对里包着<head ...
- 前言,学习ios编程(坚持)
其实,尝尝有人很疑惑,不知道自己要干嘛,看到很多的培训机构,不知道怎么选择但是又想进入软件行业.其实呢学习不一定要靠培训机构,一定要培训,特别是 当人家把自己吹的天花乱坠的时候,然并卵.出来之后,也只 ...
- Django 1.10 找不到静态资源解决方法
测试版本:Django 1.10 问题:Django项目找不到静态资源 解决方法: 1.首先你需要在自己的app下面创建2个目录 static 和 templates 树形结构如下(DjangoPr ...
- 微信小程序-地图组件
map 地图. 标记点 标记点用于在地图上显示标记的位置,不能自定义图标和样式 覆盖物 覆盖物用于在地图上显示自定义图标,可自定义图标和样式 地图组件的经纬度必填, 如果不填经纬度则默认值是北京的经纬 ...
- MyEclipse中的SVN操作手册
原文出处:http://blog.sina.com.cn/s/blog_8a3d83320100zhmp.html 1.导入项目 点击工具栏上的[File-Import],进入下图 (如果你的对话框中 ...