网上有很多XMPP的介绍 在这里我总结一下
即时通讯 : 核心在与通讯协议的不同 每个IM系统最大的区别在于通讯协议的不同
XMPP : 前身是Jabber 主要用于公司内部的通讯
基于XML 开放的 可扩展的通讯协议 典型的C/S架构
是分散型的通讯网络 : 基于XMPP协议 不同服务器之间的用户可以进行通讯
代表作是 : GTalk
Talk : 是googleIM工具 基于Jabber 可以与不同的即时通讯系统相连接
2013年 Google使用Hangouts(环聊)取代GTalk
工作原理 :
1.节点连接到服务器
2.服务器利用本地目录系统中的证书对其认证
3.节点指定目标地址,让服务器告知目标状态
4.服务器查找、连接并进行相互认证
5.节点之间进行交互
使用XMPP进行登录和下线 用cocopoads下载框架XMPPFramework
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #ff4647}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #08fa95}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #ffffff; min-height: 16.0px}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #4bd157}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px 'PingFang SC'; color: #4bd157}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #de38a6}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #ffffff}p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #eb905a}p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #4bd157; min-height: 16.0px}span.s1 {font-variant-ligatures: no-common-ligatures; color: #eb905a}span.s2 {font-variant-ligatures: no-common-ligatures}span.s3 {font-variant-ligatures: no-common-ligatures; color: #de38a6}span.s4 {font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s5 {font: 14.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures}span.s6 {font: 14.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s7 {font-variant-ligatures: no-common-ligatures; color: #08fa95}span.s8 {font: 14.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s9 {font-variant-ligatures: no-common-ligatures; color: #00b1ff}span.s10 {font-variant-ligatures: no-common-ligatures; color: #ff4647}span.s11 {font: 14.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures; color: #ff4647}span.s12 {font-variant-ligatures: no-common-ligatures; color: #4bd157}span.s13 {font: 14.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures; color: #4bd157}span.s14 {font-variant-ligatures: no-common-ligatures; color: #8b87ff}
#import "AppDelegate.h"
#import <XMPPFramework.h>
@interface AppDelegate ()<XMPPStreamDelegate>
/** 通过XMPPStream类!!!! 和服务器进行数据的传输 */
/**
针对不同的传输内容,会调用不同的代理方法,在使用XMPPFramework开发时,只需要在不同的代理方法中,填写相应的代码即可。
*/
@property(nonatomic,strong)XMPPStream* xmppStream;
/** 和服务器连接 */
-(void)connect;
/** 和服务器断开连接 */
-(void)disconnect;
/** 上线 */
-(void)shangxian;
/** 下线 */
-(void)xiaxian;
@end
@implementation AppDelegate
#pragma mark - 账户的上线和下线
/** 上线 */
-(void)shangxian{
//发送上线消息给服务器--获取状态节点
//XMPPPresence继承自XMPPElement
XMPPPresence* presence=[XMPPPresence presence];
//把节点发送给服务器
[self.xmppStream sendElement:presence];
NSLog(@"上线");
}
/** 下线 */
-(void)xiaxian{
//获取节点
XMPPPresence* presence=[XMPPPresence presenceWithType:@"available"];
//发送节点给服务器
[self.xmppStream sendElement:presence];
NSLog(@"下线");
}
#pragma mark -XMPPStream的代理方法
/** 连接服务器 */
-(void)xmppStreamDidConnect:(XMPPStream *)sender{
NSLog(@"已经和服务器进行连接");
//由XMPPStream把密码发送给服务器 确认用户能够使用 “长连接"
[self.xmppStream authenticateWithPassword:@"5435695" error:NULL];
}
/** 断开服务器 */
-(void)xmppStreamWasToldToDisconnect:(XMPPStream *)sender{
NSLog(@"和服务器断开");
//需要下线....
[self xiaxian];
}
//服务器授权成功
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
//上线
[self shangxian];
}
//服务器授权失败
-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error{
NSLog(@"密码不正确");
}
#pragma mark - 实例化XMPPStream
-(XMPPStream *)xmppStream{
if (_xmppStream==nil) {
_xmppStream=[[XMPPStream alloc]init];
//设置代理 通过代理监听数据的传输
//dispatch_queue_create(0, 0) 不能放在主队列 因为数据交互过程是耗时的 在主线程上回卡住
[_xmppStream addDelegate:self delegateQueue:dispatch_queue_create(0, 0)];
}
return _xmppStream;
}
#pragma mark - 注销激活状态
//长连接是耗资源的 需要在注销的时候 和服务器断开
- (void)applicationWillResignActive:(UIApplication *)application {
[self disconnect];
}
#pragma mark - 变成激活状态
- (void)applicationDidBecomeActive:(UIApplication *)application {
[self connect];
}
/** 和服务器进行连接 */
-(void)connect{
/** 设置服务器的名称 现在和本地域名一样 */
NSString* hostName=@"macdemacbook-air.local";
/** JID : 通过JID可以区分 所有用户 服务器 聊天室 */
/** 一个JID对应整个即时通讯的一个节点 */
/**从用户角度讲 JID =账户名+@+主机名*/
XMPPJID* myJID=[XMPPJID jidWithString:@"cc@macdemacbook-air.local"];
//赋值
self.xmppStream.hostName=hostName;
self.xmppStream.myJID=myJID;
/**
* 使用指定的主机名hostName和端口号连接到服务器
* 超时时长是可选的,如果不关心,可以使用XMPPStreamTimeoutNone
* 如果hostName(主机名)或者myJID没有设置,此方法返回NO,并且设置错误信息
问题:如何知道连接的结果呢?连接的动作,本质上是“告诉服务器我来了”!
**/
[self.xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:NULL];
}
/** 断开和服务器的连接 */
-(void)disconnect{
[self.xmppStream disconnect];
}
代码完成后 可以进行用户的登录和下线 可以安装mysql数据库 /openfile服务器 来看是否登录成功
网友评论