参考网址: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. 【cocos2d-x + Lua(1) 绑定Lua并使用tolua++】

    为什么要使用Lua进行游戏开发?转载请注明出处http://www.cnblogs.com/zisou/p/cocos2dx-lua1.html 上面一个问题我觉得在我们使用Lua之前需要深入思考的, ...

  2. IT和非IT人士:2分钟了解什么是区块链

    本文由  网易云发布. (非IT:阅读常规部分:IT:阅读引用块) 作者:任长存,网易杭州研究院工程师 前言 信息的高速发展,致使互联网风口犹如娱乐圈,移动互联网,微博.直播.共享经济.短视频.小程序 ...

  3. 4、Orcal数据库dmp文件导入

    1.CMD命令导入备份数据库dmp文件: 以上一篇博客提到的gdnh用户,我们需要在cmd窗口执行如下命令: imp gdnh/admin123@orcl file=E:/createTable.dm ...

  4. django 视图中执行原生的 sql 查询语句

    可以使用objects的raw()方法执行原生的sql语句,进行对数据库的查询操作,raw()方法只能执行查询语句 query_set = your_model.objects.raw("s ...

  5. 基于unoconv的在线office预览

    这几天在搞在线文档预览,网上查了几种方案, 第一种:使用google的在线预览 -> 国内被Q,pass 第二种:使用第三方的,比如:永中dcs -> 要钱,pass 第三种:先转换为pd ...

  6. FastAdmin 前端页面传参

    如果我们需要自己在控制器中透传数据到JS中去,则可以使用控制器的assignconfig方法来透传,使用如下 $this->assignconfig('demo', ['name'=>'名 ...

  7. ssh 登陆 端口转发

    man ssh ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] ...

  8. js之global 对象 方法

    global 作为js的全局对象,但其是无法直接访问的,但是在浏览器中浏览器是将这个对象当做是window对象的一部分,即Date 等Global的属性使用window.Date 可访问到 1.url ...

  9. js delete删除对象属性,delete删除不了变量及原型链中的变量

    js delete删除对象属性,delete删除不了变量及原型链中的变量 一.delete删除对象属性 function fun(){ this.name = 'gg'; } var obj = ne ...

  10. Redis数据类型之SDS简单动态字符串

    一,简单的动态字符串 1,Redis自己构建了一种名为简单动态字符串的抽象类型,并将SDS用作Redis的默认字符串表示, 2,在redis的数据库里面,包含字符串值的键值对在底层都是由SDS实现的 ...