XMPP 基础介绍 iOS导入XMPPFramework框架

即时通讯技术(IM -- Instant Messaging)支持用户在线实时交谈。如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容。

有许多的IM系统,如AOL、Yahoo IM、 MSN以及QQ,它们最大的区别在于各自通讯协议的实现,所以即时通讯技术的核心在于它的传输协议

协议用来说明信息在网络上如何传输,如果有了统一的传输协议,那么应当可以实现各个IM之间的直接通讯,为了创建即时通讯的统一标准,目前已经出现过的IM协议包括:IETF的对话初始协议(SIP)和即时通讯对话初始协议和表示扩展协议(SIMPLE)、应用交换协议(APEX)、显示和即时通讯协议(PRIM)及基于XML且开放的可扩展通讯和表示协议(XMPP)协议(常称为 Jabber 协议)


XMPP是基于XML的协议,用于即时消息(IM)以及在线现场探测。最初,XMPP作为一个框架开发,目标是支持企业环境内的即时消息传递和联机状态应用程序

XMPP前身是Jabber(1998年),是一个开源组织定义的网络即时通信协议


XMPP是一个分散型通信网络,这意味着,只要网络基础设施允许,任何XMPP用户都可以向其他任何XMPP用户传递消息。多个XMPP服务器也可以通过一个专门的“服务器-服务器”协议相互通信,提供了创建分散型社交网络和协作框架的可能性

XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。这表明XMPP是可扩展的。可以通过发送扩展的信息来处理用户的需求,以及在 XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配置好的系统添加功能

XMPP的核心XML流传输协议的定义使得XMPP能够在一个比以往网络通信协议更规范的平台上。借助于XML易于解析和阅读的特性,使得XMPP的协议能够非常漂亮

XMPP的即时通讯扩展应用部分是根据IETF在这之前对即时通讯的一个抽象定义的,与其他业已得到广泛使用的即时通讯协议,诸如AIM,QQ等有功能完整,完善等先进性

XMPP的扩展协议Jingle使得其支持语音和视频,目前iOS尚不支持

XMPP的官方文档是RFC 3920

XMPP协议曾经是Google力推的即时通信协议,其代表作品是GTalk

XMPP的基本结构

XMPP是一个典型的C/S架构,而不是像大多数即时通讯软件一样,使用P2P客户端到客户端的架构,也就是说在大多数情况下,当两个客户端进行通讯时, 他们的消息都是通过服务器传递的。采用这种架构,主要是为了简化客户端,将大多数工作放在服务器端进行


XMPP中定义了三个角色,客户端,服务器,网关通信能够在这三者的任意两个之间双向发生


服务器同时承担了客户端信息记录,连接管理和信息的路由功能

网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等


基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML流

XMPP工作原理

节点连接到服务器

服务器利用本地目录系统中的证书对其认证

节点指定目标地址,让服务器告知目标状态

服务器查找、连接并进行相互认证

节点之间进行交互


XMPP应用传输的是与即时通讯相关的指令。在以前这些命令要么用二进制的形式发送(比如QQ),要么用纯文本指令加空格加参数加换行符的方式发送(比如MSN)


而XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。这不但使得解析容易了,人也容易阅读了,方便了开发和查错


而XMPP的核心部分就是一个在网络上分片段发送XML的流协议。这个流协议是XMPP的即时通讯指令的传递基础,也是一个非常重要的可以被进一步利用的网络基础协议,可以说XMPP用TCP传的是XML流


优点

开放

标准(XMPP的技术规格已被定义在RFC 3920及RFC 3921)

证实可用,谷歌证实了GTalk

分散

安全

可扩展


缺点

数据负载过重XML

没有二进制传输

XMPP——JID

每个 XMPP客户端用户必须拥有一个全局惟一标识符。基于历史原因,这些标识符称为 Jabber ID或JID。鉴于协议的分布式特征,JID应包含联系用户所需的所有信息JID的结构类似于电子邮件地址,但不要求 JID同时也是有效的电子邮件收件人


客户端和服务器节点,被统称为 XMPP实体,都拥有JID。例如:SomeCorp公司的员工 John Doe可能拥有JID:John.Doe@somecorp.com,其中somecorp.com是 SomeCorp公司的XMPP服务器的地址,John.Doe是John Doe的用户名


还可以使用JID连接到其他资源。这允许在一个XMPP实体标识符之外进一步处理拓展


导入XMPPFramework框架(1)

下载XMPPFramework框架

https://github.com/robbiehanson/XMPPFramework

git clone

git clone https://github.com/robbiehanson/XMPPFramework.git


导入依赖框架

CocoaLumberjack:日志框架

CocoaAsyncSocket:底层网络框架,实现异步Socket网络通讯

需要添加CFNetwork&Security框架依赖

KissXML:XML解析框架

需要添加libxml2.dylib框架依赖

需要指定如下编译选项:

Other Linker Flags = -lxml2

Header Search Paths = /usr/include/libxml2

libidn

设置XML头文件搜索路径


设置其他链接标记



导入XMPPFramework框架(2)

将以下4个文件夹导入到项目

Authentication

Categories

Core

Utilities


另外还需要添加libresolv.dylib依赖

导入XMPPFramework框架(3)

导入XMPP扩展框架

Extensions


Sample_XMPPFramework.h添加到项目,并且重命名为XMPPFramework.h


在xcode里面要自己添加下PCH

在终端输入:

git commit -m “添加XMPP框架”

可以一次性提交所有增加的文件


XMPP框架常用扩展

XEP-0045: 多用户聊天

XEP-0060: 发布-订阅

XEP-0065: SOCKS5字节流

XEP-0085: 聊天状态通知

XEP-0096: 文件传输

XEP-0172: 用户昵称

XEP-0184: 消息送达

CoreDataStorage: 数据存储

Reconnect:重新连接

Roster:花名册


http://xmpp.org/xmpp-protocols/xmpp-extensions/


新建项目并导入XMPP框架练习

熟练掌握XMPP框架的导入过程

并且构思即将开发的XMPP项目所能包含的功能

CocoaLumberjack

是一款高性能的日志输出插件


需要配合XcodeColors插件一起使用

https://github.com/robbiehanson/XcodeColors

XMPP核心文件

XMPPStream:是开发过程中最主要交互的类,所有扩展和自定义代码均要基于此类进行

XMPPParser:供XMPPStream解析使用

XMPPJID:提供了一个不可变JID的实现,遵守NSCopying协议和NSCoding协议

XMPPElement:以下三个XMPP元素的基类

XMPPIQ :请求

XMPPMessage :消息

XMPPPresence :出席

XMPPModule:开发XMPP扩展时使用

XMPPLogging:XMPP的日志框架

XMPPInternal:整个XMPP框架内部使用的核心和高级底层内容

XMPPStream实例的配置

配置如何连接至XMPP服务器

添加代理

添加模块

开始连接

开始授权


注意:

XMPP框架仅提供了一个最小的代理委托系统用于接收三种XMPP类型(IQ、Message和Presence),如果要实现更多的功能,开发者还需要编写大量的相关代码

为了简化开发,通常将XMPPStream放置在AppDelegate中,以便于全局访问

XMPP框架提供的主要扩展功能

XMPPReconnect:如果意外中断,自动重连XMPP流

XMPPRoster:标准的XMPP花名册

XMPPRoom:提供多人聊天支持

XMPPPubSub:提供公共订阅支持

……

通信类别及公共XML属性

使用XMPP的实时消息传递系统包含三大通信类别:

消息传递,其中数据在有关各方之间传输

联机状态,允许用户广播其在线状态和可用性

信息/查询请求,它允许XMPP实体发起请求并从另一个实体接收响应


以上三种类型的XMPP节都拥有以下公共属性:

from:源XMPP实体的JID

to:目标接收者的JID

id:当前对话的可选标识符

type:节的可选子类型

xml:lang:如果内容是人们可读的,则为消息语言的描述

XMPP应用程序功能预设

用户登录、注册

添加好友 Roster

好友聊天

表情文字(CoreText)

聊天状态 XEP-0085

聊天室群聊 XEP-0045

发送文件 XEP-0096

语音聊天 XEP-0065






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个用于开发Java应用程序的开源框架,它简化了Spring应用程序的配置和部署过程。XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的协议,用于实时通信,特别是用于即时聊天和在线状态管理。 如果你想在Spring Boot应用程序中使用XMPP协议,你可以使用Smack库。Smack是一个开源的XMPP客户端库,它提供了一组易于使用的API来处理XMPP连接、通信和扩展。你可以在你的Spring Boot项目中添加Smack依赖,并使用它来建立和管理XMPP连接,发送和接收消息等。 以下是一个简单的示例代码,演示了如何在Spring Boot中使用Smack进行XMPP通信: 首先,添加Smack依赖到你的项目的pom.xml文件中: ```xml <dependency> <groupId>org.igniterealtime.smack</groupId> <artifactId>smack</artifactId> <version>4.4.4</version> </dependency> ``` 然后,创建一个XMPPManager类来处理XMPP连接和通信: ```java import org.jivesoftware.smack.*; import org.jivesoftware.smack.chat.Chat; import org.jivesoftware.smack.chat.ChatManager; import org.jivesoftware.smack.chat.ChatMessageListener; import org.jivesoftware.smack.packet.Message; public class XMPPManager { private static final String XMPP_SERVER = "your_xmpp_server"; private static final int XMPP_PORT = 5222; private static final String XMPP_USERNAME = "your_username"; private static final String XMPP_PASSWORD = "your_password"; private AbstractXMPPConnection connection; public void connect() throws Exception { XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() .setXmppDomain(XMPP_SERVER) .setHost(XMPP_SERVER) .setPort(XMPP_PORT) .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) .build(); connection = new XMPPTCPConnection(config); connection.connect(); connection.login(XMPP_USERNAME, XMPP_PASSWORD); ChatManager chatManager = ChatManager.getInstanceFor(connection); chatManager.addChatListener(new ChatManagerListener() { public void chatCreated(Chat chat, boolean createdLocally) { chat.addMessageListener(new ChatMessageListener() { public void processMessage(Chat chat, Message message) { String from = message.getFrom(); String body = message.getBody(); // 处理收到的消息 } }); } }); } public void disconnect() { if (connection != null && connection.isConnected()) { connection.disconnect(); } } public void sendMessage(String to, String messageBody) throws Exception { ChatManager chatManager = ChatManager.getInstanceFor(connection); Chat chat = chatManager.createChat(to); chat.sendMessage(messageBody); } } ``` 在你的应用程序中,你可以使用XMPPManager类来建立连接、发送消息等。 这只是一个简单的示例,你可以根据你的实际需求进行扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值