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