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”,导入刚才放到桌面的文件
然后关闭再重新打开系统偏好设置,找到openfile,点击打开,会跳转到浏览器
回到浏览器中的openfile设置
下面是默认的,一般不用修改,直接继续就可以了。
下面需要特别注意,建议将图片放大查看。
用户名和密码填mysql里设置的用户名和密码。这里是 root 和 123456
设置完成后,会要求你重新设置openfire的密码,然后就可以用用户名和密码登陆了。
按照我的步骤来,那么
Mysql的用户名和密码是 root 123456
openfire的用户名和密码是 admin 123456
这个是可以自己定义的
进入openfile设置之后,可以执行修改密码,添加用户等操作
二.登陆注册配置:
1.导入xmpp框架:配置工程
如果不用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实现的即时通讯聊天(一)的更多相关文章
- xmpp实现的即时通讯聊天(二)
参考网址:http://www.jianshu.com/p/8894a5a71b70 借图描述原理: 三.注册.登陆.聊天功能的实现 故事板如下: 四个类如下: 不喜多言,直接上Demo: Login ...
- Openfire XMPP Smack RTC IM 即时通讯 聊天 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 黑科技!仅需 3 行代码,就能将 Gitter 集成到个人网站中,实现一个 IM 即时通讯聊天室功能?
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- XMPP openfire Smack 即时通讯
重新整理下这篇文章. 这篇文章的主要任务是使用AndroidStudio,通过Openfire,利用XMPP协议完成一个可以即时通讯.拥有好友系统的聊天软件. 一.服务器配置与相关库 理论不多说,只谈 ...
- XMPP协议实现即时通讯底层书写 (一)--从RFC6121阅读開始
Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence ok,额瑞巴蒂,说好的阅读RFC61 ...
- java Activiti6 工作流引擎 websocket 即时聊天 SSM源码 支持手机即时通讯聊天
即时通讯:支持好友,群组,发图片.文件,消息声音提醒,离线消息,保留聊天记录 (即时聊天功能支持手机端,详情下面有截图) 工作流模块---------------------------------- ...
- 开源jabber(XMPP)架设内部即时通讯服务的解决方案
Jabber 是著名的即时通讯服务服务器,它是一个自由开源软件,能让用户自己架即时通讯服务器,可以在Internet上应用,也可以在局域网中应用. XMPP(可扩展消息处理现场协议)是基于可扩展 ...
- XMPP之ios即时通讯客户端开发-配置XMPP基本信息之工程代码(五)
登录功能完成以后包含以下代码文件: AppDelegate.h AppDelegate.m LoginViewController.h LoginViewController.m LoginUser. ...
- XMPP(三)-安卓即时通讯客户端
由于时间原因,所以更新比较慢 ,还请大家谅解,此次是对上篇文章中的安卓客户端初级版本进行的一次更新优化,在这次更新后,就有那么一点样子了,可以拿的出手了,呵呵,还在关注的同学也可以及时下载更新.此次主 ...
随机推荐
- 如何把OpenWrt安装到PC?
前言 什么是openwrt? 它是一个适用于路由器的Linux发行版.和其他Linux发行版一样,它也内置了包管理工具,你可以从一个软件仓库里直接安装软件.OpenWrt可以用在所有需要嵌入式Linu ...
- Android Google Analytics
基础知识: 一个统计条目包含两类,一种是 screen,另一种是 event. Screen 包括 screen name. Event 包括 category,action,label 和 val ...
- js判断图片是否加载完毕
附件: https://www.jb51.net/article/102385.htm 问题: .offset().top和$(window).scrollTop()每次刷新页面后滚动的值有时候会不 ...
- Elasticsearch Java API简介
加入依赖 我本地的Elasticsearch的版本是2.1.0,因此加入相应的maven依赖 <dependency> <groupId>org.elasticsearch&l ...
- vue复选框选中值获取
<div id="d5"> <p>{{box5.toString()}}</p> <input type="checkbox&q ...
- mysql编写存储过程(1)
存储过程:其实就是存储在数据库中,有一些逻辑语句与SQL语句组成的函数.由于是已经编译好的语句,所以执行速度快,而且也安全. 打开mysql的控制台,开始编写存储过程. 实例1: 编写存储过程: 执行 ...
- Sip协议
会话初始协议.SIP是IETF标准进程的一部分,它是在诸如SMTP(简单邮件传送协议)和HTTP(超文本传送协议)基础之上建立起来的(请求应答的通讯模式).微信采用了自主研发的SYNC协议,他通过“握 ...
- 屏蔽百度及其广告的部分Host
127.0.0.44 www.baidu.com127.0.0.44 cpro.baidu.com127.0.0.44 hm.baidu.com127.0.0.44 bdimg.share.baidu ...
- Java 并发编程——volatile与synchronized
一.Java并发基础 多线程的优点 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 这一点可能对于做客户端开发的更加清楚,一般的UI操作都需要开启一个子线程去完成某个任务,否者会容易导致客户 ...
- 搜集C++实现的线程池
现在很多语言都内置了线程池实现,但C++中却没有.本文列举一些C++实现的线程池工具. Boost.Threadpool 项目首页:http://threadpool.sourceforge.net ...