zoukankan      html  css  js  c++  java
  • xmpp实现的即时通讯聊天(一)

    参考网址:http://www.jianshu.com/p/b401ad6ba1a7

         http://www.jianshu.com/p/4edbae55a07f

    一、mysql和openfire环境的配置

    1.安装mysql,mac平台安装搜索一下教程很多的,然后安装可视化工具mysql-workbench

    然后创建数据库,如下:




     

    MYSQL Workbench,来配置数据库

         1>打开Finder,command + shift + G 



    有个红色的标记说明没有权限访问,只需要右键显示简介,将锁打开,设置一下就行了

    权限都改为读与写

    2>  MYSQL Workbench 中,双击“openfire”,它会变成深黑色,表示处于选中状态。然后点击菜单栏的“File”,导入刚才放到桌面的文件


     
    2.安装openfire
    首先要安装java环境,具体教程网上很多的,然后下载安装openfire,

    然后关闭再重新打开系统偏好设置,找到openfile,点击打开,会跳转到浏览器



     

    回到浏览器中的openfile设置

     


    选择中文简体

         下面是默认的,一般不用修改,直接继续就可以了。


    直接继续

    继续

    下面需要特别注意,建议将图片放大查看。

    用户名和密码填mysql里设置的用户名和密码。这里是 root 和 123456


    这里需要重点设置

    设置完成后,会要求你重新设置openfire的密码,然后就可以用用户名和密码登陆了。


     按照我的步骤来,那么

         Mysql的用户名和密码是 root    123456

         openfire的用户名和密码是  admin 123456

     这个是可以自己定义的

          进入openfile设置之后,可以执行修改密码,添加用户等操作

     二.登陆注册配置:

    1.导入xmpp框架:配置工程


    导入静态库

    加上-lxml2

    /usr/include/libxml2 或者 $(SDKROOT)/usr/include/libxml2

    如果不用pch文件的话则需要在报错的地方加上UIKit头文件

     2.封装xmppManager类:

    xmppManager类:

    .h文件:

    #import <Foundation/Foundation.h>
    #import "XMPPFramework.h"
    /**
     *  该类主要封装了xmpp的常用方法
     */
    @interface XMPPManager : NSObject<XMPPStreamDelegate,XMPPRosterDelegate>
    //通信管道,输入输出流
    @property(nonatomic,strong)XMPPStream *xmppStream;
    
    //好友管理
    @property(nonatomic,strong) XMPPRoster *xmppRoster;
    
    @property(nonatomic,strong) XMPPJID *fromJid;
    
    //
    //聊天信息归档
    @property(nonatomic,strong)XMPPMessageArchiving *xmppMessageArchiving;
    //信息归档的上下文
    @property(nonatomic,strong)NSManagedObjectContext *messageArchivingContext;
    
    
    //单例方法
    +(XMPPManager *)defaultManager;
    //登录的方法
    -(void)loginwithName:(NSString *)userName andPassword:(NSString *)password;
    //注册
    -(void)registerWithName:(NSString *)userName andPassword:(NSString *)password;
    -(void)logout;

    .m文件:

    #import "XMPPManager.h"
    typedef NS_ENUM(NSInteger, ConnectServerPurpose)
    {
        ConnectServerPurposeLogin,    //登录
        ConnectServerPurposeRegister   //注册
    };
    @interface XMPPManager()
    //用来记录用户输入的密码
    @property(nonatomic,strong)NSString *password;
    @property(nonatomic)ConnectServerPurpose connectServerPurposeType;//用来标记连接服务器目的的属性
    @end
    
    @implementation XMPPManager
    
    #pragma mark 单例方法的实现
    +(XMPPManager *)defaultManager{
        static XMPPManager *manager = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            manager = [[XMPPManager alloc]init];
        });
        return manager;
    }
    
    #pragma mark init方法重写
    /**
     *  重写初始化方法是因为在manager一创建就要使用一些功能,
     *    把这些功能放在初始化方法里面
     */
    -(instancetype)init{
        if ([super init]){
       //1.初始化xmppStream,登录和注册的时候都会用到它
        self.xmppStream = [[XMPPStream alloc]init];
         //设置服务器地址,这里用的是本地地址(可换成公司具体地址)
        self.xmppStream.hostName = @"sunjianfeidemacbook-air.local";
    //    设置端口号
        self.xmppStream.hostPort = 5222;
    //    设置代理
        [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
          
            
        //2.好友管理//获得一个存储好友的CoreData仓库,用来数据持久化
            
            XMPPRosterCoreDataStorage *rosterCoreDataStorage = [XMPPRosterCoreDataStorage sharedInstance];
            //初始化xmppRoster
            self.xmppRoster = [[XMPPRoster alloc]initWithRosterStorage:rosterCoreDataStorage dispatchQueue:dispatch_get_main_queue()];
            //激活
            [self.xmppRoster activate:self.xmppStream];
            //设置代理
            [self.xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
            //3.保存聊天记录
            //初始化一个仓库
            XMPPMessageArchivingCoreDataStorage *messageStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
            //创建一个消息归档对象
            self.xmppMessageArchiving = [[XMPPMessageArchiving alloc]initWithMessageArchivingStorage:messageStorage dispatchQueue:dispatch_get_main_queue()];
            //激活
            [self.xmppMessageArchiving activate:self.xmppStream];
            //上下文
            self.messageArchivingContext = messageStorage.mainThreadManagedObjectContext;
        }
        return self;
    }
    
    -(void)loginwithName:(NSString *)userName andPassword:(NSString *)password
    {
        //标记连接服务器的目的
        self.connectServerPurposeType = ConnectServerPurposeLogin;
        //这里记录用户输入的密码,在登录(注册)的方法里面使用
        self.password = password;
        /**
         *  1.初始化一个xmppStream
            2.连接服务器(成功或者失败)
            3.成功的基础上,服务器验证(成功或者失败)
            4.成功的基础上,发送上线消息
         */
        
        
        // *  创建xmppjid(用户)
        // *  @param NSString 用户名,域名,登录服务器的方式(苹果,安卓等)
       
        XMPPJID *jid = [XMPPJID jidWithUser:userName domain:@"sunjianfeidemacbook-air.local" resource:nil];
        self.xmppStream.myJID = jid;
        //连接到服务器
        [self connectToServer];
    
        //有可能成功或者失败,所以有相对应的代理方法
        
    }
    
    #pragma mark xmppStream的代理方法
    //连接服务器失败的方法
    -(void)xmppStreamConnectDidTimeout:(XMPPStream *)sender{
        NSLog(@"连接服务器失败的方法,请检查网络是否正常");
    }
    //连接服务器成功的方法
    -(void)xmppStreamDidConnect:(XMPPStream *)sender
    {
        NSLog(@"连接服务器成功的方法");
    //登录
        if (self.connectServerPurposeType == ConnectServerPurposeLogin) {
            NSError *error = nil;
    //        向服务器发送密码验证 //验证可能失败或者成功
            [sender authenticateWithPassword:self.password error:&error];
           // NSLog(@"-----%@",self.password);
        }
    //注册
        else{
            //向服务器发送一个密码注册(成功或者失败)
            [sender registerWithPassword:self.password error:nil];
        }
    }
    
    
    //验证成功的方法
    -(void)xmppStreamDidAuthenticate:(XMPPStream *)sender
    {
        NSLog(@"验证成功的方法");
        /**
         *  unavailable 离线
           available  上线
           away  离开
           do not disturb 忙碌
         */
        XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
        [self.xmppStream sendElement:presence];
    }
    //验证失败的方法
    -(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
    {
        NSLog(@"验证失败的方法,请检查你的用户名或密码是否正确,%@",error);
    }
    
    
    #pragma mark 注册
    -(void)registerWithName:(NSString *)userName andPassword:(NSString *)password{
        self.password = password;
        //0.标记连接服务器的目的
        self.connectServerPurposeType = ConnectServerPurposeRegister;
        //1. 创建一个jid
        XMPPJID *jid = [XMPPJID jidWithUser:userName domain:@"sunjianfeidemacbook-air.local" resource:nil];
        //2.将jid绑定到xmppStream
        self.xmppStream.myJID = jid;
        //3.连接到服务器
        [self connectToServer];
    }
    
    
    #pragma mark 注册成功的方法
    -(void)xmppStreamDidRegister:(XMPPStream *)sender{
        NSLog(@"注册成功的方法");
        
    }
    #pragma mark 注册失败的方法
    -(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error
    {
        NSLog(@"注册失败执行的方法");
    }
    
    #pragma mark 连接到服务器的方法
    -(void)connectToServer{
        //如果已经存在一个连接,需要将当前的连接断开,然后再开始新的连接
        if ([self.xmppStream isConnected]) {
            [self logout];
        }
        NSError *error = nil;
        [self.xmppStream connectWithTimeout:30.0f error:&error];
        if (error) {
            NSLog(@"error = %@",error);
        }
    }
    
    
    #pragma mark 注销方法的实现
    -(void)logout{
        //表示离线不可用
        XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
    //    向服务器发送离线消息
        [self.xmppStream sendElement:presence];
        //断开链接
        [self.xmppStream disconnect];
    }
    
    // 收到好友请求执行的方法
    -(void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence{
        NSLog(@"好友请求.....");
        self.fromJid = presence.from;
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示:有人添加你" message:presence.from.user  delegate:self cancelButtonTitle:@"拒绝" otherButtonTitles:@"OK", nil];
        [alert show];
    }
    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
        
        switch (buttonIndex) {
            case 0:   [self.xmppRoster rejectPresenceSubscriptionRequestFrom:self.fromJid];
                break;
            case 1:   [self.xmppRoster acceptPresenceSubscriptionRequestFrom:self.fromJid andAddToRoster:YES];
                break;
                
            default:   break;
        }
        
    }

    具体登陆注册,聊天下一篇继续........

  • 相关阅读:
    常用模块介绍
    正则表达式/re模块
    模块简介/模块的导入/模块的查找顺序/绝对导入和相对导入/软件开发目录规范
    迭代器/for循环本质/生成器/常用内置方法
    函数递归/二分法/列表,字典生成式/三元表达式/匿名函数/内置函数
    闭包函数/装饰器
    函数对象/函数的嵌套定义与调用/名称空间和作用域
    初识函数
    文件处理/光标移动/实时检测
    7-5字符编码和文件处理
  • 原文地址:https://www.cnblogs.com/sunjianfei/p/5806551.html
Copyright © 2011-2022 走看看