美文网首页iOS即时通讯技术
XMPP 与 环信的实现原理

XMPP 与 环信的实现原理

作者: ethan_cun | 来源:发表于2016-10-12 11:35 被阅读2011次

    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 与 环信的实现原理

        本文链接:https://www.haomeiwen.com/subject/jhliyttx.html