利用OpenFire实现XMPP客户端交互

其实XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性,所以在之前谷歌很推荐去使用它,并且创建了GTalk这个软件。

XMPP协议在当时被提出其实就是想做一个统一的标准,这个协议想做的就是允许因特网用户向因特网上的其他任何人发送即时消息。

XMPP的网关的存在,XMPP 架构事实上兼容所有其他即时通信网络,也就是说可以做进行协议的转换,这就提高了XMPP 的灵活性和可扩展性。

其实xmpp网关就是xmpp向外暴露了一个可以兼容其他主流通讯协议的一个接口,这样我们就可以自己实现相应的通信协议来实现xmpp和这个协议的相互转换和通信,就好比适配器模式中一个充电器的转换器,可以适配不同电压。



下面简单介绍下在ios下,利用OpenFire和XMPP框架的登录和注销,其实这里面写法很多都借鉴了其的官方示例程序,我们就能很好的进行理解

首先我们要想实现登录操作就需要去创建一个XMPPStream类,因为这个类是开发过程中用于交互的类,

分为下面这些步骤

 1、初始化XMPPStream

 2、传一个JID去连接服务器

 3、连接到服务器成功后、再发送密码进行授权

 4、授权成功后,发送"在线"消息,如果不发送在线消息的话,OpenFire上面的用户就不会显示在线的情况。


总的示例代码

#import "AppDelegate.h"
#import "XMPPStream.h"
#import "XMPPJID.h"
#import "XMPPPresence.h"

//遵守代理方法
@interface AppDelegate ()<XMPPStreamDelegate>
{
    XMPPStream * _xmppStream;
}
//1、初始化XMPPStream
-(void)setupXMPPStream;

//2、连接服务器
-(void)connectToHost;

//3、连接到服务器成功之后,去发送密码进行授权
-(void)sendPwdToHost;

//4、授权成功之后,去发送"在线"消息
-(void)sendOnlineToHost;

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //连接到服务器
    [self connectToHost];
    
    return YES;
}

#pragma mark - 初始化XMPPStream
-(void)setupXMPPStream
{
    //初始化xmppStream
    _xmppStream = [[XMPPStream alloc]init];
    
    //设置代理
    [_xmppStream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
    
}
#pragma mark 连接到服务器
-(void)connectToHost
{
    
    if(_xmppStream==nil)
    {
        [self setupXMPPStream];
    }
    
    NSLog(@"开始连接服务器");
    //连接的时候需要去设置用户的JID,JID是不会改变的,前面的参数是用户名,后面的是域名,最后一个是标识符,就比如说是iphone还是android
    XMPPJID * myJID = [XMPPJID jidWithUser:@"lisi" domain:@"fuzi.local" resource:@"iphone"];
    _xmppStream.myJID=myJID;
    
    //设置服务器的域名,这里的域名需要与IP地址关联起来才可以设置为域名,这里还可以设置为ip地址,下面的不设置就会去找上面的domain
    _xmppStream.hostName=@"127.0.0.1";
   
    //设置端口,默认就是5222,如果服务器端口是5222,就可以省略
    _xmppStream.hostPort=5222;
    
    NSError * error = nil;
    //连接,如果不需要连接超时的设置的话,那么久使用XMPPStreamTimeoutNone
    //连接配置的hostPort上的配置主机名。超时是可选的。不要超时就使用XMPPStreamTimeoutNone。如果没有设置主机名或myJID,此方法将返回NO并设置错误参数。
    if(![_xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error])
    {
        NSLog(@"%@",error);
    }

}
#pragma mark - 发送密码进行验证
-(void)sendPwdToHost
{
    NSLog(@"发送密码进行验证");
    NSError * error=nil;
    //和服务器打交道的核心类就是_xmppStream这个类
    [_xmppStream authenticateWithPassword:@"123456" error:&error];
    if(error)
    {
        NSLog(@"%@",error);
    }
}
#pragma mark - 授权成功之后去发送在线的消息
-(void)sendOnlineToHost
{
    NSLog(@"发送在线消息");
    XMPPPresence * presence = [XMPPPresence presence];
    
    NSLog(@"%@",presence);
    //发送消息
    [_xmppStream sendElement:presence];
}
#pragma mark -设置与主机连接成功的代理方法
//与主机连接成功会调用下面的代理方法
-(void)xmppStreamDidConnect:(XMPPStream *)sender
{
    NSLog(@"与主机连接成功");
    //主机连接成功后,发送密码进行授权
    [self sendPwdToHost];
}
#pragma mark - 设置与主机连接失败的代理方法
-(void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error
{
    //如果有错误就代表了解失败了
    if(error)
    {
        NSLog(@"连接失败 %@",error);
        return;
    }
       NSLog(@"与主机断开连接");
}
#pragma mark - 密码授权调用的方法
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
    NSLog(@"授权成功");
    
    //发送在线的消息给服务器
    [self sendOnlineToHost];
}

#pragma mark - 授权失败
-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
{
    NSLog(@"授权失败 %@",error);
    
}

#pragma mark - 注销的方法
-(void)logout
{
    //1、发送离线消息
    XMPPPresence * offline = [XMPPPresence presenceWithType:@"unavailable"];
    
    [_xmppStream sendElement:offline];
    //2、与服务器断开连接
    [_xmppStream disconnect];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值