XMPP 与 环信的实现原理

XMPP

The Extensible Messaging and PresenceProtocol(可扩展通讯协议)

1.XMPP是一个即时通讯的协议,它规范了用于即时通讯在网络上传输数据的格式,XMPP在网络上传输的格式为XML格式,eg:登录,把用户名和密码放到XML的标签中,传输到服务器

2.XMPP是一个基于socket 的网络协议,目的是为了保持长连接,以实现即时通讯

3.XMPP的客户端是使用一个XMPPFramework框架实现的

4.XMPP的服务器是使用Openfire,一个开源的服务器

客户端获取服务器发送过来的好友消息,客户端需要对XML进行解析,使用的解析框架为KissXML   框架,而不是NSXMLParser(苹果的解析)/GDataXML(谷歌的解析)

缺点:

1.发送图片、语音、文档比较麻烦

2.没有提供发送附件的功能,需要自己实现

实现方法:把文件上传到服务器,让后把保存的地址发送给好友

环信

1.环信是一个即时通讯的服务商

2.环信使用的是XMPP协议,它是对XMPP协议的二次开发,对服务器Openfire和客户端进行功能性模块的增加与SDK的封装,环信的本质还是使用XMPP,基于Socket的网络协议

3.环信内部实现了数据缓存,会把聊天记录添加到数据库,把附件下载到本地

4.环信内部已经实现了音频、视频、图片,等其他附件的发送功能

环信可能出现的问题

http://www.finalshares.com/read-779

优点:

1.不需要公司内部搭建服务器

2.客户端的开发,使用环信的SKD比使用XMPPFrameWork更简洁方便

XMPP的使用

1.要先下载XMPPFramework框架,并导入到工程中,XMPP 是罗宾汉森编写的开源框架

需要的头文件为

//导入头文件

#import"XMPP.h"

#import"XMPPRoster.h"

#import"XMPPRosterCoreDataStorage.h"

#import

#import"XMPPUserCoreDataStorageObject.h"

主要基于以下三个主要部分

数据传输:XMPPStream//基础通讯的服务器类,所有的数据传输都是这个类负责。

数据交换格式:XML

数据库:CoreData  // 会使用到coredata来存储数据

@property(nonatomic,strong)XMPPRoster*xmppRoster;

//好友类别的数据库

@property(nonatomic,strong)XMPPRosterCoreDataStorage*xmppRosterStorage;

//1.初始化基础服务类

_xmppStream= [[XMPPStreamalloc]init];

传输数据使用的是XML可以用DDXMLElement自定义XML格式

NSFetchedResultsController  // 可以监听数据库数据的变化

- (NSFetchedResultsController*)fetchedResultsController

{

if(!_fetchedResultsController)

{

//XMPPUserCoreDataStorageObject就是好友列表的实体

//1.查询对象

NSFetchRequest*request = [NSFetchRequestfetchRequestWithEntityName:@"XMPPUserCoreDataStorageObject"];

//2.设置排序

NSSortDescriptor*sort = [NSSortDescriptorsortDescriptorWithKey:@"jidStr"ascending:YES];

request.sortDescriptors=@[sort];

//3.获取上下文

NSManagedObjectContext*context = [[XMPPManagermanager]rosterStorageObjectContext];

//sectionNameKeyPath如果为空,表示一组

_fetchedResultsController= [[NSFetchedResultsControlleralloc]initWithFetchRequest:requestmanagedObjectContext:contextsectionNameKeyPath:nilcacheName:nil];

_fetchedResultsController.delegate=self;

}

return_fetchedResultsController;

}

//开始侦听好友列表CoreData的数据库变化

[self.fetchedResultsControllerperformFetch:nil];

*当前侦听的数据库发生后会自动触发

- (void)controller:(NSFetchedResultsController*)controller didChangeObject:(id)anObject atIndexPath:(nullableNSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(nullableNSIndexPath*)newIndexPath

{

[self.friendTableViewreloadData];

}

jid 是一个Model 保存着用户的信息

XMPP 用CoreData 保存数据

实现消息发送的原理

GCDAsyncSoket — TCP用

0 -1024 操作系统的端口

1025 — 65536 可用端口

-xml2 other link flag

你可能感兴趣的:(XMPP 与 环信的实现原理)