热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XMPP详解(2)

IM的实现原理     在我最初学习编程的时候,曾经用JAVA实现了一个最简单版的IM通讯,即通过Socket建立两台电脑之间的连接,然后发送IO流来进行即
  • IM的实现原理

    在我最初学习编程的时候&#xff0c;曾经用JAVA实现了一个最简单版的IM通讯&#xff0c;即通过Socket建立两台电脑之间的连接&#xff0c;然后发送IO流来进行即时通讯&#xff0c;我们现在所使用的IM软件尽管看上去非常复杂&#xff0c;但是基本的原理和以上的差不多&#xff0c;无非是采用服务器<>客户端的架构&#xff0c;通过登陆到服务器来获取个人资料和好友&#xff0c;然后聊天时直接通过IP和好友进行即时通讯。

  • XMPP协议的网络架构

    XMPP是一个典型的C/S架构&#xff0c;而不是像大多数即时通讯软件一样&#xff0c;使用P2P客户端到客户端的架构&#xff0c;也就是说在大多数情况下&#xff0c;当两个客户端进行通讯时&#xff0c;他们的消息都是通过服务器传递的(也有例外&#xff0c;例如在两个客户端传输文件时)&#xff0e;采用这种架构&#xff0c;主要是为了简化客户端&#xff0c;将大多数工作放在服务器端进行&#xff0c;这样&#xff0c;客户端的工作就比较简单&#xff0c;而且&#xff0c;当增加功能时&#xff0c;多数是在服务器端进行&#xff0e;XMPP服务的框架结构如下图所示&#xff0e;XMPP中定义了三个角色&#xff0c;XMPP客户端&#xff0c;XMPP服务器、网关&#xff0e;通信能够在这三者的任意两个之间双向发生&#xff0e;服务器同时承担了客户端信息记录、连接管理和信息的路由功能&#xff0e;网关承担着与异构即时通信系统的互联互通&#xff0c;异构系统可以包括SMS(短信)、MSN、ICQ等&#xff0e;基本的网络形式是单客户端通过TCP&#xff0f;IP连接到单服务器&#xff0c;然后在之上传输XML&#xff0c;工作原理是&#xff1a;

  1. 节点连接到服务器&#xff1b;
  2. 服务器利用本地目录系统中的证书对其认证&#xff1b;
  3. 节点指定目标地址&#xff0c;让服务器告知目标状态&#xff1b;
  4. 服务器查找、连接并进行相互认证&#xff1b;
  5. 节点之间进行交互。

    XMPP协议的传输是通过XML文件来传输的&#xff0c;并且不是类似于QQ的点对点通讯&#xff0c;而是客户端到服务器再到客户端的方式来实现&#xff0c;以上过程的一个简单的XMPP通讯流程可以如下&#xff1a;

  1.  首先&#xff0c;由客户端连接到服务器&#xff0c;客户端通过IO流发送一段XML文件&#xff0c;在文件中包含了自身的用户名和密码。
  2.  服务器端接收到客户端的XML文件&#xff0c;从中获取用户名和密码进行验证&#xff0c;如果验证成功&#xff0c;服务器会发送一个XML文件给客户端表明已经登录成功。
  3.  登陆成功后&#xff0c;客户端可以通过发送一个获取好友名单的XML文件&#xff0c;服务器会将当前用户的好友以XML文件传到客户端。
  4.  客户端选择一个好友&#xff0c;向其发送信息&#xff08;其实是向服务器发送&#xff0c;服务器收到后会转发给对应的好友&#xff09;&#xff0c;好友收到。

     通过以上的流程&#xff0c;一此基本的通讯得以达成。

Spark架构

    &#xff08;上图为XMPP的一个实现Openfire&#43;Smack&#43;Spark的实现&#xff09;

  • XMPP协议的一些概念

     通过以上简介&#xff0c;我们了解了XMPP协议的基本流程&#xff0c;下面来了解一个XML中一些基本的概念。


    • XMPP地址

          一个实体在XMPP网络结构中被称为一个节点&#xff0c;它有唯一的标示符jabber identifier(JID)&#xff0c;即实体地址&#xff0c;用来表示一个用户&#xff0c;但是也可以表示其他内容&#xff0c;例如一个聊天室&#xff0e;一个有效的JID包括一系列元素&#xff1a;(1)域名(domain identifier)&#xff1b;(2)节点(node identifier)&#xff1b;(3)源(resource identifier)&#xff0e;它的格式是node&#64;domain/resource&#xff0c;node&#64;domain&#xff0c;类似电子邮件的地址格式&#xff0e;domain用来表示接点不同的设备或位置&#xff0c;这个是可选的&#xff0c;例如a在Server1上注册了一个用户&#xff0c;用户名为doom&#xff0c;那么a的JID就是doom&#64;serverl&#xff0c;在发送消息时&#xff0c;指明doom&#64;serverl就可以了&#xff0c;resource可以不用指定&#xff0c;但a在登录到这个Server时&#xff0c;fl的JID可能是doom&#64;serverl、exodus(如果a用Exodus软件登录)&#xff0c;也可能是doom&#64;serverl/psi(如果a用psi软件登录)&#xff0e;资源只用来识别属于用户的位置或设备等&#xff0c;一个用户可以同时以多种资源与同一个XMPP服务器连接。

      • XMPP的XML流

          即时通讯的聊天是指上就是二进制流或者字符流。在以前这些命令要么用2进制的形式发送&#xff08;比如QQ&#xff09;&#xff0c;要么用纯文本指令加空格加参数加换行苻的方式发送&#xff08;比如MSN&#xff09;。而XMPP传输的即时通讯指令的逻辑与以往相仿&#xff0c;只是协议的形式变成了XML格式的纯文本。这不但使得解析容易了&#xff0c;人也容易阅读了&#xff0c;方便了开发和查错。而XMPP的核心部分就是一个在网络上分片断发送XML的流协议。这个流协议是XMPP的即时通讯指令的传递基础&#xff0c;也是一个非常重要的可以被进一步利用的网络基础协议。所以可以说&#xff0c;XMPP用TCP传的是XML流。 

         举个例子看看所谓的XML流是什么样子的&#xff1f; 

      客户端&#xff1a; 

        
             to&#61;&#39;example.com&#39; 

             xmlns&#61;&#39;jabber:client&#39; 

             xmlns:stream&#61;&#39;http://etherx.jabber.org/streams&#39; 

             version&#61;&#39;1.0&#39;> 

      服务器&#xff1a; 

        
             from&#61;&#39;example.com&#39; 

             id&#61;&#39;someid&#39; 

             xmlns&#61;&#39;jabber:client&#39; 

             xmlns:stream&#61;&#39;http://etherx.jabber.org/streams&#39; 

             version&#61;&#39;1.0&#39;> 

      ...其他通信... 

      客户端&#xff1a;
                    to&#61;&#39;romeo&#64;example.net&#39; 

                    xml:lang&#61;&#39;en&#39;> 

      客户端&#xff1a; Art thou not Romeo, and a Montague? 

      客户端&#xff1a;
       

      服务器&#xff1a;
                    to&#61;&#39;juliet&#64;example.com&#39; 

                    xml:lang&#61;&#39;en&#39;> 

      服务器&#xff1a;Neither, fair saint, if either thee dislike. 

      服务器&#xff1a;
       

      客户端&#xff1a; 

      服务器&#xff1a; 

          以文档的观点来看&#xff0c;客户端或服务器发送的所有XML文本连缀在一起&#xff0c;从构成了一个完整的XML文档。其中的stream标签就是所谓的XML Stream。在中间的那些...这样的XML元素就是所谓的XML Stanza&#xff08;XML节&#xff09;。XMPP核心协议通信的基本模式就是先建立一个stream&#xff0c;然后协商一堆安全之类的东西&#xff0c;中间通信过程就是客户端发送XML Stanza&#xff0c;一个接一个的。服务器根据客户端发送的信息以及程序的逻辑&#xff0c;发送XML Stanza给客户端。但是这个过程并不是一问一答的&#xff0c;任何时候都有可能从一个方发信给另外一方。通信的最后阶段是关闭流&#xff0c;关闭TCP/IP连接。

      • XML节


          XML节通过XML流来发送&#xff0c;XMPP定义了三种顶级XML节


          XMPP给这三种节定义了五种通用属性

      1. to
      2. from
      3. id
      4. type
      5. xml:lang


          to属性指定接收节的JID。

          from属性指定发送者的JID。

          id属性是可选的。并且&#xff0c;在接收应用&#xff08;通常是一个服务器&#xff09;中是唯一的。注意&#xff1a;流ID可能是严格安全的&#xff0c;并且因此必须是即不能预测也不能重复的

          type属性指定目的或消息上下文&#xff0c;出席或IQ节的详细信息。iq节的type属性有&#xff1a;Error&#xff0c;Get&#xff0c;Result&#xff0c;Set; presence节的type属性有&#xff1a;Available&#xff0c;Subscribe&#xff0c;Subscribed&#xff0c;Unsubscribe&#xff0c;        Unsubscribed&#xff0c;Unavailable&#xff0c;Probe&#xff0c;Error&#xff0c;Invisible; message节的type属性有&#xff1a;Chat&#xff0c;Error&#xff0c;GroupChat&#xff0c;Headline&#xff0c;Normal

          xml:lang属性值指定任意可读XML字符数据的缺省语言

          节定义了消息语义&#xff0c;节可被看作“推”机制&#xff0c;一个实体推信息给其它实体&#xff0c;与EMAIL系统中发生的通信类似。所有消息节应该拥有‘to’属性&#xff0c;指定有意的消息接收者&#xff1b;根据接收到那样的一个节&#xff0c;服务器应该路由或传送它到有意的接收者。

          节定义了出席语义&#xff0c;节可被看作基本广播或“出版-订阅”机制&#xff0c;多实体收到他们已订阅&#xff08;在这种情况下&#xff0c;网络可利用信息&#xff09;实体的信息。总的来说&#xff0c;出版实体应该发送一个不带‘to’属性的出席节&#xff0c;在这种情况下&#xff0c;与此实体相连的服务器应该广播给所有订阅实体。然而&#xff0c;一个出版实体也可能发送一个带有‘to’属性的出席节&#xff0c;此种情况下&#xff0c;服务器应该路由或传送节到有意的接收者。

          节定义了请求语义&#xff0c;节可被看作一个请求&#xff0d;响应机制&#xff0c;与[HTTP]在某些方面相似。IQ语义让一个实体向其它实体请求或接收其它实体的响应成为可能。请求与响应的数据内容由IQ无素的直接子元素的命名空间声明定义&#xff0c;并且&#xff0c;交互由请求实体通过使用‘id’属性来跟踪。因此&#xff0c;IQ交互遵从结构化数据交换的一个通用模式&#xff0c;此交换例如得到/结果或设置/结果&#xff08;虽然如果合适的话&#xff0c;对一个请求的响应可能会以错误返回&#xff09;。




      推荐阅读
      • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
      • Java序列化对象传给PHP的方法及原理解析
        本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
      • 如何在服务器主机上实现文件共享的方法和工具
        本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
      • ejava,刘聪dejava
        本文目录一览:1、什么是Java?2、java ... [详细]
      • SQL Server 2008 到底需要使用哪些端口?
        SQLServer2008到底需要使用哪些端口?-下面就来介绍下SQLServer2008中使用的端口有哪些:  首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果 ... [详细]
      • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
        本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
      • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
      • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
      • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
      • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
      • mac php错误日志配置方法及错误级别修改
        本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
      • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
      • iOS超签签名服务器搭建及其优劣势
        本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
      • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
      • 恶意软件分析的最佳编程语言及其应用
        本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
      author-avatar
      骏马奔腾09
      这个家伙很懒,什么也没留下!
      PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
      Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有