参考网址: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 = ;
// 设置代理
[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 : [self.xmppRoster rejectPresenceSubscriptionRequestFrom:self.fromJid];
break;
case : [self.xmppRoster acceptPresenceSubscriptionRequestFrom:self.fromJid andAddToRoster:YES];
break; default: break;
} }

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

xmpp实现的即时通讯聊天(一)的更多相关文章

  1. xmpp实现的即时通讯聊天(二)

    参考网址:http://www.jianshu.com/p/8894a5a71b70 借图描述原理: 三.注册.登陆.聊天功能的实现 故事板如下: 四个类如下: 不喜多言,直接上Demo: Login ...

  2. Openfire XMPP Smack RTC IM 即时通讯 聊天 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. 黑科技!仅需 3 行代码,就能将 Gitter 集成到个人网站中,实现一个 IM 即时通讯聊天室功能?

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  4. XMPP openfire Smack 即时通讯

    重新整理下这篇文章. 这篇文章的主要任务是使用AndroidStudio,通过Openfire,利用XMPP协议完成一个可以即时通讯.拥有好友系统的聊天软件. 一.服务器配置与相关库 理论不多说,只谈 ...

  5. XMPP协议实现即时通讯底层书写 (一)--从RFC6121阅读開始

    Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence ok,额瑞巴蒂,说好的阅读RFC61 ...

  6. java Activiti6 工作流引擎 websocket 即时聊天 SSM源码 支持手机即时通讯聊天

    即时通讯:支持好友,群组,发图片.文件,消息声音提醒,离线消息,保留聊天记录 (即时聊天功能支持手机端,详情下面有截图) 工作流模块---------------------------------- ...

  7. 开源jabber(XMPP)架设内部即时通讯服务的解决方案

    Jabber 是著名的即时通讯服务服务器,它是一个自由开源软件,能让用户自己架即时通讯服务器,可以在Internet上应用,也可以在局域网中应用.    XMPP(可扩展消息处理现场协议)是基于可扩展 ...

  8. XMPP之ios即时通讯客户端开发-配置XMPP基本信息之工程代码(五)

    登录功能完成以后包含以下代码文件: AppDelegate.h AppDelegate.m LoginViewController.h LoginViewController.m LoginUser. ...

  9. XMPP(三)-安卓即时通讯客户端

    由于时间原因,所以更新比较慢 ,还请大家谅解,此次是对上篇文章中的安卓客户端初级版本进行的一次更新优化,在这次更新后,就有那么一点样子了,可以拿的出手了,呵呵,还在关注的同学也可以及时下载更新.此次主 ...

随机推荐

  1. Day 24 继承

    # 一.什么是继承 # 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可成为基类或超类,新建类称为派生类或子类.# python中类的继承分为:单继承和多继承cla ...

  2. js代码上的优化

    例1  if ( config.url === '/web/teacher/classes'  || config.url === '/web/teacher/students || config.u ...

  3. 2018年Android面试题含答案--适合中高级(下)

    这里是我整理出来的面试题,答案我花了很久的时间.加上我自己的理解整理出来的,作者不易,请谅解.有答案的的:https://xiaozhuanlan.com/topic/6132940875   1.A ...

  4. python实战——网络爬虫

    学习网络爬虫的目的: 1,可以私人定制一个搜索引擎,可以深层次的了解搜索引擎的工作原理. 2,大数据时代,要进行数据分析,首先要有数据源,学习爬虫,可以让我们获取更多的数据. 3,从业人员可以可好的利 ...

  5. nginx代理websocket协议

    以下是代码段.location /wsapp/ {     proxy_pass http://wsbackend;     proxy_http_version 1.1;     proxy_set ...

  6. NSCache 的好处

    相较于 NSDictionary 线程安全 系统资源将要耗尽时,自动删减缓存 自动删减"最久未使用的"对象 不会自动拷贝键.因为有些键不支持拷贝操作 可以和 NSPurgeable ...

  7. css实现响应式九宫格效果

    1. 首先看下九宫格的效果图: 2. html代码比较简单,如下: <div class="main"> <div class="box1"& ...

  8. POJ 2376

    #include<iostream>//by chengdacaizi. #include<stdio.h> #define MAXN 25005 using namespac ...

  9. VSTO学习(六)——创建Outlook解决方案

    本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案的,所以本专题中将为大家介绍下Outlook相关的内容.我 ...

  10. Restore HBase Data

    方法 1: Restoring HBase data by importing dump files from HDFS The HBase Import utility is used to loa ...