使用第三方框架 XMPPFramework
 
#import "ViewController.h"
#import "XMPPFramework.h"

@interface ViewController ()<XMPPStreamDelegate>{
   
    XMPPStream *_stream;
    XMPPRoster *_roster;
}

@end

/*
 
 
 二、如何集成XMPP协议框架
 
 1. xmpp框架使用ARC
 2. 依赖的框架:
 1> libxml.dylib    header search Path: /usr/include/libxml2
 2> libresolv.dylib
 
 三、开源的XMPP服务器端程序
 1. openfire
 */

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

//管理xmpp链接的类
    _stream = [[XMPPStream alloc]init];
    [_stream setHostName:服务器];//服务器域名
    [_stream setHostPort:5222];//可以不设置,默认5222
    [_stream addDelegate:self delegateQueue:dispatch_get_main_queue()];
   
    //重连
    XMPPReconnect *reconnect = [[XMPPReconnect alloc]init];
    [reconnect activate:_stream];
   
   
    //花名册
    XMPPRosterCoreDataStorage *storage = [[XMPPRosterCoreDataStorage alloc]init];
    //好友管理
    _roster = [[XMPPRoster alloc]initWithRosterStorage:storage];
    [_roster addDelegate:self delegateQueue:dispatch_get_main_queue()];
    [_roster activate:_stream];
   
}
//注册
- (IBAction)registerAction:(id)sender {
   
   
    XMPPJID *jid = [XMPPJID jidWithString:@"anonymous"];//匿名链接先

_stream.myJID = jid;
   
   BOOL isSuccess = [_stream connectWithTimeout:-1 error:nil];
   
    if (isSuccess == NO) {
       
        NSLog(@"建立链接失败");
    }
 
   
}

// 登陆
- (IBAction)loginAction:(id)sender {
   
    XMPPJID *jid = [XMPPJID jidWithString:@"sui_1"];
    _stream.myJID = jid;

BOOL isSuccess = [_stream connectWithTimeout:-1 error:nil];
   
    if (!isSuccess) {
        NSLog(@"登陆失败");
       
    }
}

//登陆成功调用的代理
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{

NSLog(@"登陆成功");
   
    //设置登陆状态--在线
    XMPPPresence *presence = [[XMPPPresence alloc]init];
    [_stream sendElement:presence];
   
    //设置登陆状态--离线
//    XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
//    [_stream sendElement:presence];
   
   
}

//建立链接 成功后 才调用
- (void)xmppStreamDidConnect:(XMPPStream *)sender{
 
 /* //注册
    XMPPJID *jid = [XMPPJID jidWithString:@"sui_3"];//设置注册名
    [_stream setMyJID:jid];
   BOOL isSuccess = [_stream registerWithPassword:@"password" error:nil];//设置密码
   
    if (isSuccess == NO) {
        NSLog(@"链接失败");
    }
 
 */
//----------------------------------------------------------------
   
    //登陆
    XMPPJID *jid = [XMPPJID jidWithString:@"sui_1"];//登陆ID
    [_stream setMyJID:jid];
   
   BOOL isSuccess = [_stream authenticateWithPassword:@"password" error:nil];//登陆密码
   
    if (!isSuccess) {
       
        NSLog(@"登陆失败");
    }
 
}

- (void)xmppStreamDidRegister:(XMPPStream *)sender{
   
    NSLog(@"注册成功");
}

/*
 XML格式:
 <iq type="get"
   from="xiaoming@example.com"
   to="example.com"
   id="1234567">
   <query xmlns="jabber:iq:roster"/>
 <iq />
 
 type 属性,说明了该 iq 的类型为 get,与 HTTP 类似,向服务器端请求信息
 from 属性,消息来源,这里是你的 JID
 to 属性,消息目标,这里是服务器域名
 id 属性,标记该请求 ID,当服务器处理完毕请求 get 类型的 iq 后,响应的 result 类型 iq 的 ID 与 请求 iq 的 ID 相同
 <query xmlns="jabber:iq:roster"/> 子标签,说明了客户端需要查询 roster
 */

//获取好友列表
- (IBAction)getFriendsListAction:(id)sender {
   
    //创建一个IQ便签
    DDXMLElement *element_iq = [DDXMLElement elementWithName:@"iq"];
    [element_iq addAttributeWithName:@"type" stringValue:@"get"];
    [element_iq addAttributeWithName:@"from" stringValue:_stream.myJID.description];
    [element_iq addAttributeWithName:@"to" stringValue:_stream.myJID.domain];
    [element_iq addAttributeWithName:@"id" stringValue:@"sui"];
   
//    DDXMLElement *query = [DDXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];

//或者
    DDXMLElement *element_query = [DDXMLElement elementWithName:@"query"];
    [element_query addAttributeWithName:@"xmlns" stringValue:@"jabber:iq:roster"];
   
   
    [element_iq addChild:element_query];
    [_stream sendElement:element_iq];
   
}

/*
 XML格式:
 一个 IQ 响应:
 
 <iq type="result"
   id="1234567"
   to="xiaoming@example.com">
   <query xmlns="jabber:iq:roster">
     <item jid="xiaoyan@example.com" name="小燕" />
     <item jid="xiaoqiang@example.com" name="小强"/>
   <query />
 <iq />
 
 type 属性,说明了该 iq 的类型为 result,查询的结果
 <query xmlns="jabber:iq:roster"/> 标签的子标签 <item />,为查询的子项,即为 roster
 item 标签的属性,包含好友的 JID,和其它可选的属性,例如昵称等。
 */

//接受成功
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq{
   
    if ([iq.type isEqualToString:@"result"]) {
       
        DDXMLElement *query = [iq childElement];
       
        for (DDXMLElement *item in [query children]) {
           NSString *jid = [item attributeStringValueForName:@"jid"];
            NSString *name = [item attributeStringValueForName:@"name"];
            NSLog(@"///%@--%@///",jid,name);
        }
    }
   
    return YES;
}

- (IBAction)addFriendAction:(id)sender {
   
    XMPPJID *jid = [XMPPJID jidWithString:@"sui_3"];//sui_1登陆,加sui_3为好友
    [_roster addUser:jid withNickname:@""];
   
   
   
}

/**
 
 发送的xml内容格式:
 <message type="chat" to="xiaoming@example.com">
 
   <body>Hello World!</body>
 
 </message>
 */

//发送信息 -- 满足发送格式即可发送信息
- (IBAction)sendMessage:(id)sender {
   
    DDXMLElement *element = [DDXMLElement elementWithName:@"message"];
    [element addAttributeWithName:@"type" stringValue:@"chat"];
    [element addAttributeWithName:@"to" stringValue:@"sui_3"];
   
    DDXMLElement *element_body = [DDXMLElement elementWithName:@"body" stringValue:@"你好啊"];//待发送内容
   
    [element addChild:element_body];
   
    [_stream sendElement:element];
   
   
}

//已经接收到信息后调用的代理
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message{
   
    NSLog(@"::::%@",message);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

XMPP即时通信(基础)的更多相关文章

  1. XMPP即时通讯基础知识

    XMPP参考 一.定义 XMPP 是一种很类似于http协议的一种数据传输协议,它的过程就如同“解包装--〉包装”的过程,用户只需要明白它接受的类型,并理解它返回的类型,就可以很好的利用xmpp来进行 ...

  2. (转)基于即时通信和LBS技术的位置感知服务(二):XMPP协议总结以及开源解决方案

    在<基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案>一文中,提到尝试使用XMPP协议来实现即时通信.本文将对XMPP协议框架以及相关的C/S架构进行介绍,协议的底层实现不 ...

  3. 基于XMPP协议的Android即时通信系

    以前做过一个基于XMPP协议的聊天社交软件,总结了一下.发出来. 设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务 ...

  4. 【原】iOS学习43即时通信之XMPP(2)

    本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *r ...

  5. 【原】iOS学习42即时通信之XMPP(1)

    1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...

  6. iOS开发-即时通信XMPP

    1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...

  7. xmpp即时通讯的笔记(摘抄)

    xmpp的使用: 即时通讯 instant messaging(IM) :  -->实时收发信息! 即时通讯相关软件: **QQ,MSN,GoogleTalk,AIM,Jabber(XMPP别名 ...

  8. 即时通信(IM)和实时通信(RTC)的区别

    即时通信(IM=nstant messaging)和实时通信(rtc=Real-time communication)都是一套网络通信系统,其本质都是对信息进行转发.其最大的不同点,是对信息传递的时间 ...

  9. QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件

    QQ 编辑 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件.腾讯QQ支持在线聊天.视频通话.点对点断点续传文件.共享文件.网络硬盘.自定义面板.QQ邮箱等多种功 ...

随机推荐

  1. 网页链接qq

    <a href="mqqwpa://im/chat?chat_type=wpa&uin=12345678&version=1&src_type=web& ...

  2. kafka java实例

    生产者 package com; import java.util.Properties; import java.util.concurrent.TimeUnit; import kafka.jav ...

  3. 小米Git

    这个题目的意思其实就是要分别从根节点开始遍历(dfs)到给定的两个点,然后从得出的路径中获取最早相同的点即为结果.   class Solution { public: /** * 返回git树上两点 ...

  4. LINUX 命令定期执行可执行文件

    linux命令将nodejs文件变成可执行文件 在linux中一般我们在运行node文件时用的命令为: node example.js 首先.删除文件后缀,在linux命令下添加可执行权限 mv ex ...

  5. 2-4. Using auto with Functions

    在C++14中允许使用type deduction用于函数参数和函数返回值 Return Type Deduction in C++11 #include <iostream> using ...

  6. io流(详询请加qq:2085920154)

    import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class ioTest ...

  7. 关于KB905474正版验证补丁破解办法 KB905474是个微软操作系统正版/盗版监测间谍软件。更新安装后,右下角有个提示说“系统监测到你的操作系统是盗版”。 如果没有安装的: 在系统提示更新的时候注意看一下,如果包含有“更新KB905474”就去掉“更新KB905474”方框前的勾,点击关闭(注意如果没有去掉那个勾得话,会找不到“关闭”,而是“确定”),在不在提示我该消息前打勾。 如果已经安装

    关于KB905474正版验证补丁破解办法 KB905474是个微软操作系统正版/盗版监测间谍软件.更新安装后,右下角有个提示说“系统监测到你的操作系统是盗版”. 如果没有安装的: 在系统提示更新的时候 ...

  8. ASP.NET MVC+Entity Framework 访问数据库

    Entity Framework 4.1支持代码优先(code first)编程模式:即可以先创建模型类,然后通过配置在EF4.1下动态生成数据库. 下面演示两种情形: 1.代码优先模式下,asp.n ...

  9. 使用 VisualCode + iTerm2 提交github的Pull Request

    VisualCode集成github功能,是程序猿参与开源项目的利器.相比Sublime简单了很多(插件安装繁琐,比如你试试在Sublime2 安装gosublime,这里有坑; Sublime 3修 ...

  10. 20145229&20145316 《信息安全系统设计基础》 实验二 固件设计

    实验封面 实验步骤 1.配置环境 开发环境的配置同实验一 2.拷贝文件 将实验代码拷贝到共享文件夹中 3.在虚拟机中编译代码 4.下载调试 在超级终端中运行可执行文件pthread,可得实验结果如图 ...