即时通讯——XMPP
XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性。因此基于XMPP的应用具有很强的可扩展性。经扩展后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。
它用于即时消息以及在线现场探测,促进服务器之间的准即时操作。这个协议可能最终允许因特网用户向因特网上的其它任何人发送即时消息,即使用户之间操作系统和浏览器不同。
XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。XMPP目前被IETF国际标准组织完成了标准化工作。标准化的核心结果分为两部分:(1)核心的XML流传输协议(2)基于XMLFreeEIM流传输的即时通讯扩展应用。
XMPP协议的组成:
主要的XMPP协议范本以及当今应用广泛的XMPP扩展:
RFC 3920 XMPP:核心。定义了XMPP协议框架下应用的网络架构,引入了XML Stream(XML 流)与XML Stanza(XML 节),并规定XMPP协议在通信过程中使⽤的XML 标签。使用XML标签从根本上说是协议开放性与扩展性的需要。此外,在通信的安全⽅方⾯,把TLS 安全传输机制与SASL 认证机制引⼊到内核,与XMPP进⾏无缝的连接,为协议的安全性、可靠性奠定了基础。Core文档还规定了错误的定义及处理、XML的使⽤规范、JID(Jabber Identifier Jabber 标识符)的定义、命名规范等等。所以这是所有基于XMPP协议的应用都必需⽀持的文档。
RFC 3921:用户成功登录服务器后,发布更新自己的在线好友管理、发送即时聊天消息等业务。所有的这些业务都是通过三种基本的XML节来完成的:IQ Stanza(IQ节),Presence Stanza(Presence节),Message Stanza(Message 节)。RFC3921还对阻塞策略进⾏了定义,定义是多种阻塞方式。可以说,RFC3921是RFC 3920 的充分补充。两个文档结合起来,就形成了一个基本的即时通信协议平台,在这个平台上可以开发出各种各样的应⽤。
//使用xmpp注册用户
-(void)registerUser
{
//创建xmppStream 灵魂者
stream = [[XMPPStream alloc] init];
//添加代理对象
[stream addDelegate:self delegateQueue:dispatch_get_main_queue()];
//设置端口号
[stream setHostPort:5222];
//设置域名
[stream setHostName:@"127.0.0.1"];
//设置jid
XMPPJID *newUser = [XMPPJID jidWithUser:@"abc" domain:@"wangjin" resource:@"iOS"];
//设置jid
[stream setMyJID:newUser];
//连接服务器
[stream connectWithTimeout:10 error:nil];
}
//使用XMPP登录
-(void)login
{
//创建xmppStream 灵魂者
stream = [[XMPPStream alloc] init];
//添加代理对象
[stream addDelegate:self delegateQueue:dispatch_get_main_queue()];
//设置端口号
[stream setHostPort:5222];
//设置域名
[stream setHostName:@"127.0.0.1"];
//创建用户JID
XMPPJID *userJID = [XMPPJID jidWithUser:@"456" domain:@"wangjin" resource:@"iOS"];
//将userJID设置给Stream
[stream setMyJID:userJID];
NSError *error;
//连接登录 连接后将自动调用代理方法
BOOL isConnect = [stream connectWithTimeout:10 error:&error];
}
上线状态:
-(void)goOnline
{
//上线状态
XMPPPresence *presence = [XMPPPresence presence];
//发送在线状态
[stream sendElement:presence];
}
XMPP代理方法:
#pragma mark --------XMPPStreamDelegate
-(void)xmppStreamDidConnect:(XMPPStream *)sender
{
//连接成功
if (_isRegister) {
//注册
[_xmppStream registerWithPassword:_password error:nil];
}
else
{
//验证密码 登录
[_xmppStream authenticateWithPassword:_password error:nil];
}
}
-(void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError*)error
{
NSLog(@"连接失败");
}
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
NSLog(@"验证成功");
//修改上线的状态
[self goOnline];
//认证成功发送通知
[[NSNotificationCenter defaultCenter] postNotificationName:kXMPP_Login_Success object:nil];
}
-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
{
NSLog(@"验证失败");
NSError *registerError;
//如果注册 那么一定要有用户的连接操作
BOOL isRegister = [stream registerWithPassword:@"abc" error:®isterError];
if (!isRegister) {
NSLog(@"failed");
}
}
#pragma mark ------注册后调用的代理
-(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error
{
NSLog(@"注册失败");
}
-(void)xmppStreamDidRegister:(XMPPStream *)sender
{
NSLog(@"注册成功");
}
网友评论