xmpp实现个人聊天

来源:互联网 发布:如何评价金泰熙 知乎 编辑:程序博客网 时间:2024/04/27 02:32
最近一直相研究下如何用xmpp第三方库写一个实现群组聊天的Demo但苦于没人给指路,所以就从个人聊天开始下手。这里就讲一下个人聊天用xmpp如何实现
第一步、首先导入xmpp第三方库,当然为了能够顺利运行,你需要做的还有为这个库搭建环境,首先在buildsetting里面搜application  然后添加路径/usr/include/libxml2  然后导入五个系统库 libxml2.dylib CFnetwork.framework SystemConfiguration.framework Security.framework以及 libresolv.dylib  然后就可以运行了 。
关于xmpp最近也搜寻了一些资料   大体上就是说了一些xmpp的一些格式以及一些由来等等 例如其前身是jabber所以会看到jabberID,JID的地址格式:[node]@[domain]/[resource],其中node是节点,也就是在网路中的实体,即你的用户名,domain是指服务器域名,而resource指的是用户的设备,一个用户可以用多个设备进行登录(同时不同时我就不是很清楚了),其实这个resource一般都不写。最重要的一点 因为是xmpp是通过流传播的,所以在TCP传播中传播的其实就是xml所以在调用方法的时候需要传输的一些可能就是xml格式的东西 
下面是上课的时候一个Demo
首先确定xmpp是通过流进行传播,所以第一步要先创建流。关于XMPPRoster我也不是很懂  看英文文档解释的也是比较粗浅 个人觉得这个东西实现的用流应该也可以实现 但是可能会比流的方法要简单一些,可能理解有些偏差。
要想懂得如何实现个人聊天 我觉得首先应该要明确的一点就是理解XMPPStreamDelegate这个代理协议调用方法的意思以及知道何时调用  知道了这个应该也就理解了这个聊天是怎么用这个三方库实现的

//

//  ViewController.m

//  XMPPDemo

//

//  Created by pk on 14/10/17.

//  Copyright (c) 2014 pk.All rights reserved.

//


#import"ViewController.h"

#import"XMPPFramework.h"


#defineHOST @"1000phone.net"


@interfaceViewController (){

    IBOutletUITextField* _nameField;

    IBOutletUITextField* _passwordField;

    IBOutletUITextField* _friendField;

    IBOutletUITextField* _textField;

    XMPPStream* _stream;

    XMPPRoster* _roster;

}


- (IBAction)reg:(id)sender;

- (IBAction)login:(id)sender;

- (IBAction)addFriend:(id)sender;

- (IBAction)sendMessage:(id)sender;

- (IBAction)getFriendList:(id)sender;


@end


@implementationViewController



- (void)viewDidLoad

{

    [superviewDidLoad];


   //xmpp

    _stream = [[XMPPStream alloc]init];

   //设定服务器

    [_streamsetHostName:HOST];

   //添加代理

    [_streamaddDelegate:selfdelegateQueue:dispatch_get_main_queue()];


   //roster

    _roster = [[XMPPRoster alloc]initWithRosterStorage:[[XMPPRosterCoreDataStorage alloc]init]];

    [_rosteraddDelegate:selfdelegateQueue:dispatch_get_main_queue()];

   //stream关联

    [_rosteractivate:_stream];

}


//上线

- (void)goOnline{

   //

    XMPPPresence* presence =[XMPPPresence presence];

    //发送

    [_streamsendElement:presence];

}


//下线

- (void)goOffline{

   //

    XMPPPresence* presence =[XMPPPresence presenceWithType:@"unavailable"];

    [_streamsendElement:presence];

    [_stream disconnect];

}


//注册

- (void)reg:(id)sender{

   //如果现在已经连接,先断开

    if(_stream.isConnected) {

       [selfgoOffline];

    }

   //设置jid

    [_stream setMyJID:[XMPPJIDjidWithString:[NSString stringWithFormat:@"%@@%@",_nameField.text, HOST]]];

   //设置tag

    _stream.tag = @"注册";

   //连接服务器

    [_streamconnectWithTimeout:30error:nil];

}


//登陆

- (void)login:(id)sender{

   //如果连接,断开

    if(_stream.isConnected) {

       [selfgoOffline];

    }

   //设置登陆jid

    [_stream setMyJID:[XMPPJIDjidWithString:[NSString stringWithFormat:@"%@@%@",_nameField.text, HOST]]];

   //tag

    _stream.tag = @"登陆";

    [_streamconnectWithTimeout:30error:nil];

}


//添加好友

- (void)addFriend:(id)sender{

   

    [_rostersubscribePresenceToUser:[XMPPJID jidWithString:[NSStringstringWithFormat:@"%@@%@",_friendField.text, HOST]]];

}


//得到好友列表

- (void)getFriendList:(id)sender{

   

    XMPPIQ* iq = [XMPPIQiqWithType:@"get"];

    [iqaddAttributeWithName:@"id"stringValue:@"roster"];

    NSXMLElement* query =[NSXMLElement elementWithName:@"query"xmlns:@"jabber:iq:roster"];

    [iq addChild:query];

    [_stream sendElement:iq];

}


//发送消息

- (void)sendMessage:(id)sender{

   

    XMPPMessage* msg =[XMPPMessage messageWithType:@"chat"to:[XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@",_friendField.text, HOST]]];

    NSXMLElement* body =[NSXMLElement elementWithName:@"body"stringValue:_textField.text];

    [msg addChild:body];

    [_streamsendElement:msg];


}


//连接到服务器

- (void)xmppStreamDidConnect:(XMPPStream*)sender{

    //注册

    if([sender.tag isEqualToString:@"注册"]){

       [_streamregisterWithPassword:_passwordField.text error:nil];

    }

    //登陆

    if([sender.tag isEqualToString:@"登陆"]){

       [_streamauthenticateWithPassword:_passwordField.text error:nil];

    }

}


//注册成功

- (void)xmppStreamDidRegister:(XMPPStream*)sender{

    NSLog(@"注册成功");

}

//注册失败

- (void)xmppStream:(XMPPStream*)sender didNotRegister:(DDXMLElement *)error{

    NSLog(@"注册失败");

}


//登陆成功

- (void)xmppStreamDidAuthenticate:(XMPPStream*)sender{

    NSLog(@"登陆成功");

    //上线

    [selfgoOnline];

}


//登录失败

- (void)xmppStream:(XMPPStream*)sender didNotAuthenticate:(DDXMLElement *)error{

    NSLog(@"登陆失败");

}


//接收到好友请求

- (void)xmppStream:(XMPPStream*)sender didReceivePresence:(XMPPPresence *)presence{

   //同意添加好友,是否也要添加对方为好友

    [_rosteracceptPresenceSubscriptionRequestFrom:presence.fromandAddToRoster:NO];

}


//得到好友列表

- (BOOL)xmppStream:(XMPPStream*)sender didReceiveIQ:(XMPPIQ *)iq{

   

    for(NSXMLElement*item iniq.childElement.children){

      NSString*jid = [item attributeStringValueForName:@"jid"];

       NSLog(@"%@",jid);

    }

    

   return YES;

}


//接收到消息

- (void)xmppStream:(XMPPStream*)sender didReceiveMessage:(XMPPMessage*)message{

   

    NSLog(@"%@",message.XMLString);

}




@end


0 0
原创粉丝点击