XMPP: 是一個(gè)即時(shí)通訊的傳輸協(xié)議,傳輸?shù)臄?shù)據(jù)都是 XML 格式.
對(duì)于XMPP框架的分析:
運(yùn)行他給我們的實(shí)例程序可知,他直接輸入JID和密碼就可以登入,原來(lái)他是把我們?cè)谖谋究蛑休斎氲男畔⑾缺4嬖谏澈?然后從沙盒中讀取之后傳給服務(wù)器,值得注意的是,他在登錄到服務(wù)器的時(shí)候,并沒(méi)有同時(shí)把賬號(hào)和密碼發(fā)送給服務(wù)器,當(dāng)賬號(hào)對(duì)了的時(shí)候,進(jìn)行連接,連接成功后才發(fā)送密碼.
對(duì)于GCDAsyncSocket:
!!!他是將輸入,輸出流封裝了,不用繁瑣的使用C語(yǔ)言
//創(chuàng)建clientSocket對(duì)象
self.clientSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
//連接主機(jī)(IP地址+端口)
uint16_t port = 8888;
NSError *error = nil;
//連接
if(![self.clientSocket connectToHost:self.ipTextField.text onPort:port error:&error]){
//返回是否連接成功
NSLog(@"客戶端連接服務(wù)器端失敗:%@",error.userInfo);
}else{
NSLog(@"正在連接......");
}
AsyncSocket 代理
//監(jiān)聽(tīng)和服務(wù)器的連接成功(socket洞打通)
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port{
NSLog(@"連接成功,可以發(fā)送消息");
}
//監(jiān)聽(tīng)是否發(fā)送成功
-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{
NSLog(@"客戶端發(fā)送成功");
//數(shù)據(jù)發(fā)送成功后,自己調(diào)用一下讀取數(shù)據(jù)的方法,接著_socket才會(huì)調(diào)用下面的代理方法
[self.clientSocket readDataWithTimeout:-1 tag:tag];
}
//監(jiān)聽(tīng)有服務(wù)器端發(fā)送來(lái)的消息
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
//把data顯示到UITextView上
NSString *messageStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
self.showMessageTextView.text = [NSString stringWithFormat:@"%@%@\n",self.showMessageTextView.text, messageStr];
}
實(shí)現(xiàn)登錄:
//登錄的指令
NSString *loginStr = @"iam:zhangsan";
//把Str轉(zhuǎn)成NSData
NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];
// 發(fā)送登錄指令給服務(wù)
[self.clientSocket writeData:data withTimeout:-1 tag:101];
XMPP核心文件
XMPPStream:是開(kāi)發(fā)過(guò)程中最主要交互的類,所有擴(kuò)展和自定義代碼均要基于此類進(jìn)行
XMPPParser:供XMPPStream解析使用
XMPPJID:提供了一個(gè)不可變JID的實(shí)現(xiàn),遵守NSCopying協(xié)議和NSCoding協(xié)議
XMPPElement:以下三個(gè)XMPP元素的基類
XMPPIQ :請(qǐng)求(加好友)
XMPPMessage :消息
XMPPPresence :出席(標(biāo)示用戶的在線狀態(tài))
XMPPModule:開(kāi)發(fā)XMPP擴(kuò)展時(shí)使用
XMPPLogging:XMPP的日志框架
XMPPInternal:整個(gè)XMPP框架內(nèi)部使用的核心和高級(jí)底層內(nèi)容
XMPP實(shí)現(xiàn)登錄
XMPPFrame框架是通過(guò)代理的方式實(shí)現(xiàn)消息傳遞的
實(shí)現(xiàn)用戶登錄的步驟如下:
- 實(shí)例化XMPPStream并設(shè)置代理,同時(shí)添加代理到工作隊(duì)列
- 使用JID連接至服務(wù)器,默認(rèn)端口為5222,JID字符串中需要包含服務(wù)器的域名
- 在完成連接的代理方法中驗(yàn)證用戶密碼,連接完成后XMPPStream的isConnect屬性為YES
- 在驗(yàn)證代理方法中判斷用戶是否登錄成功
- 上線或者下線成功后,向服務(wù)器發(fā)送Presence數(shù)據(jù),以更新用戶在服務(wù)器的狀態(tài)
XMPP電子名片的使用
1.需要在XMPPFramework.h中啟用電子名片的擴(kuò)展頭文件:
import "XMPPvCardCoreDataStorage.h"
import"XMPPvCardTempModule.h"
// 實(shí)例化電子名片模塊
xmppvCardStorage= [XMPPvCardCoreDataStoragesharedInstance];
_xmppvCardModule= [[XMPPvCardTempModulealloc] initWithvCardStorage:_xmppvCardStorage];
// 激活電子名片模塊
[_xmppvCardModuleactivate:_xmppStream];
XMPP花名冊(cè)的使用
- 要使用花名冊(cè)首先需要在XMPPFramework.h中啟用電子名片的擴(kuò)展頭文件:
import "XMPPRoster.h"
import "XMPPRosterCoreDataStorage.h"
- 定義屬性及成員變量
- 為XMPPSteam添加花名冊(cè)擴(kuò)展
- 設(shè)置花名冊(cè)代理
- 在需要時(shí)使用花名冊(cè)