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