即时通信系统IM--XMPP
即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷;服务提供商也提供了越来越丰富的通讯服务功能。 不容置疑,Internet已经成为真正的信息高速公路。从实际工程应用角度出发,以计算机网络原理为指导,结合当前网络中的一些常用技术,编程实现基于C/S架构的网络聊天工具是切实可行的。月工资发放总额、月考勤罚款统计、参保金额统计、公积金金额统计。
实时通信(Instant Messaging,简称IM)是一个实时通信系统,允许两人或多人使用网络实时的传递文字消息、文件、语音与视频交流。
即时通讯的安全威胁包括:ID被盗、隐私威胁、病毒威胁等,下面是即时通讯用户应该遵循的一些安全准则,以保护自身的网络安全和隐私。
即时通讯安全准则主要包括:不随意泄露即时通讯的用户名和密码;不在第三方网站登录网页版即时通讯软件;定期更改密码;谨慎使用未经认证的即时通讯插件;在即时通讯设置中开启文件自动传输病毒扫描选项;不接收来历不明或可疑的文件和网址链接。
系统的逻辑视图
C-XX:用户端使用自己定义的协议与NAS、ACS进行通信,提供IM的基本功能。
NAS:为用户C-XX分配ACS服务器,在用户登录时进行。NAS简单的采用轮转的方式,依次分配系统中存在的ACS给登陆的用户。
ACS:为用户提供IM服务端功能,主要有用户信息的修改,用户状态的维护,用户消息的处理等。ACS之间的逻辑结构是网状的,任何两个ACS都可以平等的进行通信。
DB:保存用户的状态,不同的DB分成不同的区,维护不同段的用户。每个ACS到各个分区的数据库都有连接,ACS根据用户所在的区,访问相应的数据库,存取用户的数据。
技术原理与工作方式
用户A输入自己的用户名和密码登陆IM服务器,服务器通过读取用户数据库来验证用户身份,如果验证通过,登记用户A的IP地址IM客户端软件的版本号及使用的TCP/UDP端口号,然后返回用户A登陆成功的标志,此时用户A在IM系统中的状态为在线(Online)
根据用户A存储在IM服务器上的好友列表,服务器将用户A在线的相关信息发送给也同时在线的IM好友的PC机,这些信息包括在线状态、IP地址、IM客户端使用的TCP端口(Port)号等,IM好友的客户端收到此信息后将在予以提示。
是IM服务器把用户A存储在服务器上的好友列表及相关信息回送到他的客户端机,这些信息包括在线状态、IP地址、IM客户端使用的TCP端口(port)号等信息,用户A的IM客户端收到后将显示这些好友列表及其在线状态。
实现原理
基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议。前 者是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议。而后者是以数 据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议。
目前互联网产品使用的即时通信协议有这几种:即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)以及XMPP。PRIM与XMPP、SIMPLE类似,但已经不再使用了。
本次要讲的是XMPP,由Openfire实现.
XMPP详解
XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议。在此基础上,XMPP协议已经被用来构建大规模即时通信系统、游戏平台、协作空间及语音和视频会议系统。
XMPP由几个小的构造块组成,并在此基础上扩展出了更多的构造块。XMPP中有众多系统:发布-订阅服务、多人聊天、表单检索与处理、服务发现、实时数据传输、隐私处理及远程过程调用等。
大多数社交媒体(Facebook及Twitter)也采用了XMPP协议。
什么是XMPP
与其他协议一样,XMPP定义了在两个或者更多通信实体间传递数据所采用的格式。对于XMPP,实体通常是指客户端服务器,但是其也允许客户端与客户端或服务器端与服务器端的通信。
在XMPP上交换的是XML数据,采用这种格式,使XMPP协议获得了极大的可扩展性,因为使用XML可以方便的新增功能并保证前后向兼容。使用XML较二进制协议占用更大的带宽,但获得的优势是具有了几乎无限的可扩展性。
用户可以向XMPP Standards Foundation注册协议扩展。
在XMPP中,XML数据被组织为了一对流,每个流分别对应通信的一个方向。每个XML流均由一个开始元素、后跟XMPP节和其他顶级元素,然后是一个结束元素组成。每个XMPP节(可带有子元素及属性)均是该流的一级子元素。在XMPP连接末尾,这两个流形成了一对有效的XMPP文档。
XMPP节构成了该协议的核心部分,而XMPP应用程序则关注如何发送和响应各种类型的节。节可能包含网络上其他实体的信息、类似于电子邮件的个人消息或为计算机处理而设计的结构化数据。
<message to=’elizabeth@longbourn.lit’ from=’darcy@pemberley.lit/dance’ type=’chat’> <body>what think you of books</body> </message>
在一个典型的XMPP会话中,一个上述的节将会从darcy的XMPP客户端发送到她的XMPP服务器,她的服务器将会注意到该节的目的地是某个远程服务器上的一个实体,因此与该远程服务器先建立XMPP连接,并将消息转发该处。
这种通信网络与电子邮件类似,但与电子邮件服务器不同的是,XMPP间的服务器可以直接通信,而不需要借助中间服务器。
这种直接通信避免了垃圾信息的干扰,且还支持通过TLS(Transport Layer Security,传输层安全)来加密通信并通过SASL(Simple Authentication and Security Layers,简单身份验证与安全层)实现身份验证机制。
XMPP使用传递短小信息来设计的,而非针对大型数据块,但XMPP能够用来协商并建立可在端点间传递大型数据块的带内或者带外传输
1、Openfire与XMPP
Openfire是开源的实时协作服务器(RTC),它是基于公开协议XMPP(RFC-3920),并在此基础上实现了XMPP-IM(RFC-3921),扩展了IM功能,对实施协作的各种场景做较全面的考虑,如用户在线状态切换、消息订阅、通知等等,因此可以用来搭建即时通信服务器,其搭建的方法也很简易。
RFC-3920与RFC-3921的说明:
(1)RFC-3920:XMPP的核心。定义了XMPP协议框架下应用的网络架构,引入了XMLStream(XML流)与XMLStanza(XML节),并规定XMPP协议在通信过程中使用的XML标签。使用XML标签从根本上说是协议开放性与扩展性的需要。此外,在通信的安全方面,把TLS 安全传输机制与SASL 认证机制引入到内核,与XMPP进行无缝的连接,为协议的安全性、可靠性奠定了基础。Core文档还规定了错误的定义及处理、XML 的使用规范、JID(Jabber Identifier,Jabber 标识符)的定义、命名规范等等。所以这是所有基于XMPP协议的应用都必需支持的文档。
(2)RFC-3921:用户成功登陆到服务器之后,发布更新自己的在线好友管理、发送即时聊天消息等业务。所有的这些业务都是通过三种基本的XML 节来完成的:IQ Stanza(IQ 节), Presence Stanza(Presence 节), Message Stanza(Message 节)。RFC3921 还对阻塞策略进行了定义,定义是多种阻塞方式。可以说,RFC3921 是RFC3920的充分补充。两个文档结合起来,就形成了一个基本的即时通信协议平台,在这个平台上可以开发出各种各样的应用。
2、Openfire的特点:
(1)超强的扩展能力
XMPP协议,继承了在XML灵活的扩展性,通过扩展发送扩展信息、或者在原有的信息中增加扩展节点来处理用户需求。另外,Openfire本身也支持插件开发,开发者可以根据需求,以插件的形式添加所需要的功能,例如好友列表、群成员列表等,而不需要去修改核心的源代码。
(2)并发能力
Openfire的通信处理基于Apache MINA框架实现,单机可支持上万的并发,同时也支持集群。
(3)安全性:
XMPP在C2S通信,和S2S通信中都使用TLS协议作为通信通道的加密方法,保证通信的安全
(3)对Web的支持:
Openfire采用内置的jetty作web服务器,可以方便的在上面增加WEB功能。jetty服务器是随AdminConsolePlugin插件时启动,通过调用startup()方法。9090为其明文端口,9091为其加密端口。
3、通信机制
1、帐号体系
(1)XMPP服务器的帐号基础,是域(Domain),例如:org.example.com,它在服务器配置时的时候设置,也是服务器能被访问到的域名或IP地址。客户端连接的时候,用这个域去寻找服务器。
(2)JID:XMPP中,任何一个可能进行通信的实体,包括一个用户、或者一个聊天室,都需要一个JID。
用户的JID格式为:usre@domain,如:abc@org.example.com
聊天室的JID为:room@conference.domain, 如ABC@conference.org.example.com
一般情况,JID后面还会附带一个资源名(resource),指代这个客户端的来源,比如:abc@org.example.com/pc-abc,表示这个JID在一台名为pc-abc的设备上登录。这是同一个帐号能够在多个设备中登录的基础。
2、通信端口
C-S连接的端口是5222 ,S-S连接的端口为5269,这些端口已经在IANA注册。
3、通信机制
当客户端连接上XMPP服务器创建会话时,首先是建立一个TCP长连接,并在这个连接上收发XML流进行协商,协商通过后,服务端与客户端,可以通过Message、Presence、IQ这三种格式进行数据交换。
这三种数据交换格式,下面逐个做介绍:
(1)Message:基本的消息发送,不要求得到响应,用于即时通信、群组、通知等
结构如下:
<message from='1002@zy-fordestiny' to='1001@zy-fordestiny' xml:lang='en'>
<body>Are you OK?</body>
</message>
其中:
To : 消息接收方JID。
from : 消息发送方JID
body: 所要发送的消息。
(2)Presence:用来表明用户的状态,当用户离线或改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态.
结构如下:
<presence from='1001@zy-fordestiny' to='1002@zy-fordestiny'>
<status> Online </status>
</presence>
(3)IQ:一种请求/响应机制,类似于Http的get请求。
结构如下:(以客户端请求服务器绑定资源为例)
<iq type='set' id='bind_1'>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>
</iq>
iq消息中,type是主要属性,值包括:
Get :获取当前域值。
Set :设置或替换get查询的值。
Result :说明成功的响应了先前的查询。
Error: 查询和响应中出现的错误。
https://blog.csdn.net/qq_45072595/article/details/93172041
https://www.cnblogs.com/Fordestiny/p/7462745.html
https://www.cnblogs.com/lurenq/p/7026448.html
例子:仿QQ、微信的通信系统--https://www.cnblogs.com/JackJiang/
即时通信系统IM--XMPP的更多相关文章
- 基于XMPP的即时通信系统的建立(二)— XMPP详解
XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...
- 基于XMPP的即时通信系统的建立 — XMPP IQ详解
XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...
- 【即时通讯】即时通讯及XMPP概述及…
在讲解XMPP前,我们需要先了解什么是即时通讯技术: * 即时通讯技术(IM - InstantMessaging)支持用户在线实时交谈.当一方需要发送消息时,用户必须打开一个窗口,以便让用户与交流对 ...
- 即时通信系统中如何实现:全局系统通知,并与Web后台集成?【低调赠送:QQ高仿版GGTalk 5.1 最新源码】
像QQ这样的即时通信软件,时不时就会从桌面的右下角弹出一个小窗口,或是显示一个广告.或是一个新闻.或是一个公告等.在这里,我们将其统称为“全局系统通知”.很多使用GGTalk的朋友都建议我加上一个类似 ...
- 即时通信系统中如何实现:聊天消息加密,让通信更安全? 【低调赠送:QQ高仿版GG 4.5 最新源码】
加密重要的通信消息,是一个常见的需求.在一些政府部门的即时通信软件中(如税务系统),对聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新的GG 4.5中,增加了对聊天消息 ...
- 【即时通讯】XMPP调试与简单使用
上篇讲了[即时通讯]即时通讯及XMPP概述及环境配置,接下来我们就要进行调试,看看是否可用! 在测试之前我们需要先事先保存一些东西,以便后面使用 —— 登录openfire后台 ——获取服务器名和端口 ...
- 【原】iOS学习43即时通信之XMPP(2)
本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *r ...
- UI进阶 即时通讯之XMPP好友列表、添加好友、获取会话内容、简单聊天
这篇博客的代码是直接在上篇博客的基础上增加的,先给出部分代码,最后会给出能实现简单功能的完整代码. UI进阶 即时通讯之XMPP登录.注册 1.好友列表 初始化好友花名册 #pragma mark - ...
- 急急如律令!火速搭建一个C#即时通信系统!(附源码分享——高度可移植!)
(2016年3月更:由于后来了解到GGTalk开源即时通讯系统,因此直接采用了该资源用于项目开发,在此对作者表示由衷的感谢!) —————————————————————————————————— 人 ...
随机推荐
- MySQL JOIN原理(转)
先看一下实验的两张表: 表comments,总行数28856 表comments_for,总行数57,comments_id是有索引的,ID列为主键. 以上两张表是我们测试的基础,然后看一下索引,co ...
- RNN、LSTM介绍以及梯度消失问题讲解
写在最前面,感谢这两篇文章,基本上的框架是从这两篇文章中得到的: https://zhuanlan.zhihu.com/p/28687529 https://zhuanlan.zhihu.com/p/ ...
- WCF 学习系列——WCF的学习基础
这个系列的博客由WCF4 高级编程学习记录,如有错误请指正. 首先介绍一些概念: SOA: (Service-Oriented Architecture 面向服务架构),一种架构方法,也是一种编程模式 ...
- 不安装Oracle客户端使用PLSQL Developer
一.下载 1.Oracle Instant Client: (需要安装 Visual Studio 2013 redistributable.) basic-windows.x64-18.5下载地址: ...
- 完成一个springboot项目的完整总结-------二
我们接着上篇继续写,继续进行springboot项目 一. swagger2 接口描述,测试每个接口是否有效 1. 添加依赖 pom.xml 在编辑pom.xml之前,要先关闭spring-boot项 ...
- python列表命令
创建普通列表:member;: 创建混合列表:mix: 创建空列表:empty >>> member = ['lala','oo'] >>> member ['la ...
- 动手动脑-------找出指定文件夹下所有扩展名为.txt和.java的文件
思路:首先向获取文件,如果是文件的话,则判断它是否以".txt"或".java"结尾,如果是则输出它的路径.如果是文件夹的话,则需获取子文件,利用递归方法遍历子 ...
- php 数组的计算
数组是我们最常用到的类型,那如何计算某个一维数组的个数呢.其实我们可以用到我们之前学过的数学函数里面的一个:count(). 我们来看看count函数的用法: int count ( mixed $变 ...
- Mysql 碎片整理与统计信息收集
======重新收集统计信息======= 1.分析和存储表的关键字分布 analyze table table_name; analyze 用于收集优化器的统计信息.和tuning相关:对 myis ...
- (尚010)Vue列表的搜素和排序
1.test010.html <!DOCTYPE html><html lang="en"><head> <meta charset=&q ...