iOS之即時通信相關理解

Socket:ios

1>Socket又稱"套接字」程序員

2>網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket。數據庫

3>應用程序一般經過"套接字"向網絡發出請求或者應答網絡請求
 
網絡通訊的要素:
1>網絡上的請求就是經過Socket來創建鏈接而後互相通訊
2>IP地址(網絡上主機設備的惟一標識)
3>端口號(定位程序)
4>用於標示進程的邏輯地址,不一樣進程的標示
5>有效端口:0~65535,其中0~1024由系統使用或者保留端口,開發中建議使用1024以上的端口
6>傳輸協議(用什麼樣的方式進行交互)通信的規則: 常見協議:TCP、UDP
 
TCP&UDP:
TCP(傳輸控制協議)
1>創建鏈接,造成傳輸數據的通道
2>在鏈接中進行大數據傳輸(數據不受限制)
3>經過三次握手完成鏈接,是可靠協議,安全送達
4>必須創建鏈接,效率會稍低

 UDP(用戶數據報協議)json

1>將數據及源和目的封裝成數據包中,不須要創建鏈接
2>每一個數據報的大小限制在64K以內
3>由於無需鏈接,所以是不可靠協議
4>不須要創建鏈接,速度快
 
Socket通訊流程圖:

1.HTTP 底層就是經過socket創建鏈接通訊管道,實現數據傳輸緩存

2.HTTP是一個TCP的傳輸協議(方式),它是一個可靠,安全的協議安全

 
實現Socket服務端監聽:
實現socket的監聽方法
(1)使用C語言實現,
(2)使用CocoaAsyncSocket第三方框,內部是對C的封裝
Telnet命令 telnet host port/telnet 192.168.10.10 5288
telnet命令是鏈接服務器上的某個端口對應的服務
 
轉發消息服務:
多個客戶端鏈接到服務器
當一個客戶端發送消息服務器時,服務器轉發給其它已經鏈接的客戶端。
至關於一個羣聊的雛形
 
Socket層上的協議:
Socket層上的協議指的數據傳輸的格式
1>HTTP協議

    傳輸格式:假設:這是假設,實際http的格式不是這樣的。服務器

   http1.1,content-type:multipart/form-data,content-length:188,body:username=zhangsan&password=123456微信

XMPP協議,是一款即時通信協議

  可擴展消息處理現場協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線現場探測。這個協議可能最終容許因特網用戶向因特網上的其餘任何人發送即時消息網絡

  傳輸格式:架構

  <from>zhangsan<from>

   <to>lisi<to>

   <body>一塊兒吃晚上</body>

2>自定義即時通信協議,json格式

{

「from」:」zhangsan」,

」to」:」lisi」,

」body」:」中午一塊兒吃飯」

}

 

即時通信 :即時通信,又稱實時通信

即時通訊(Instant Messaging,簡稱IM)是一個實時通訊系統,容許兩人或多人使用網絡實時的傳遞文字消息、文件、語音與視頻交流
即時通信在開發中使用的場景
開發一個類型於微信,QQ,易信的聊天軟件
在電商APP集成買家與賣家的實時溝通等
當前時下,實現即時通信的方案
1.XMPP
2.環信
 
XMPP是什麼:
(1)XMPP:The Extensible Messaging and Presence Protocol(可擴展通信和表示協議)
(2)XMPP是一種基於XML的即時通信協議,XMPP的官方文檔是RFC 3920
 這個文檔定義了登陸,退出,獲取好友,發送消息等等的XML 數據傳輸協議
(3)XMPP是一個典型的C/S架構,基本的網絡形式是客戶端經過TCP/IP鏈接到服務器,經過Socket創建鏈接,而後在之上傳輸XML流
(4)XMPP是一種相似於HTTP協議的一種數據傳輸協議,其過程就如同「解包裝--〉包裝」的過程。只須要理解其接收的類型及返回的類型,即可以很好的利用XMPP來進行數據通信
(5)XMPP官方網站—— http://xmpp.org
 
XMPP實現即時通訊的準備工做:
1>下載Openfire服務器
2>下載XMPPFramework框架
 
環信:
環信是一個第三平臺,提供即時通訊(IM –Instant Messaging )的服務
環信是在XMPP的基礎上進行二次開發
環信在網絡上傳輸的數據也是XML
使用環信,不用本身搭建服務器,節約成本
環信日活30萬如下,永遠免費
公司如要開發即時通信軟件,建議首選環信,環信佔用市場份額較大
 
集成環信的前提準備:
1>註冊成爲環信開發者
http://www.easemob.com
2>在開發者後臺建立APP獲取Key
3>下載官方SDK DEMO
http://www.easemob.com/docs/ios/IOSSDKPrepare/
 
集成SDK步驟:
1>根據官網導入SDK和相應依賴
2>初始化應用,有兩個方法
/*
*registerSDKWithAppKey: 區別app的標識,開發者註冊及管理後臺
apnsCertName: iOS中推送證書名稱。製做與上傳推送證書
*/
//環信的初始化
//    [[EaseMob sharedInstance] registerSDKWithAppKey:@"vgios#hxchat" apnsCertName:@」」];
    
//環信的初始化 並隱藏日誌輸出
    [[EaseMob sharedInstance] registerSDKWithAppKey:@"vgios#hxchat" apnsCertName:@"" otherConfig:@{kSDKConfigEnableConsoleLogger:@(NO)}];

環信登陸:

註冊:

[[EaseMob sharedInstance].chatManager asyncRegisterNewAccount:」vgios1」 password:」123456」 withCompletion:^(NSString *username, NSString *password, EMError *error) {
        NSLog(@"error:%@ username:%@ pwd:%@",error,username,password);
    } onQueue:nil];

自動登陸:

自動登陸:固然程序再次啓動時,若是用戶已經成功登陸過,不須要用戶再輸入用戶名和密碼進行登陸
實現方法
(1)把登陸賬號信息保存下來,程序起動發送登陸請求
(2)環信已經實現了自動登陸,只須要在第一次登陸成功後調用 下面的方法便可
[[EaseMob sharedInstance].chatManager setIsAutoLoginEnabled:YES];
總結:無論哪一種方法,實質都是再次調用了登陸的網絡請求
 
自動鏈接:
若是網絡不經過,用戶應該自動鏈接到服務器,以及時接收消息
此功能無需程序員本身作,環信框架已實現,環信SDK會調用自動鏈接的代理方法來通知應用程序
/*!
 @method
 @brief 將要發起自動重連操做時發送該回調
 @discussion
 @result
 */
- (void)willAutoReconnect;
 
/*!
 @method
 @brief 自動重連操做完成後的回調(成功的話,error爲nil,失敗的話,查看error的錯誤信息)
 @discussion
 @result
 */
- (void)didAutoReconnectFinishedWithError:(NSError *)error;

EMChatManagerBuddyDelegate:

上面的協議的實現了對用戶的基本操做,如
(1)添加好友
(2)從本地獲取好友列表
(3)從服務器獲取最新好友列表
(4)接收好友添加請求
(5)刪除好友
(6)被好友從名單上刪除
 
文字發送:

環信消息發送的流程

1.先把記錄保存到Conversation表

2.接着發送網絡請求,API以下

[[EaseMob sharedInstance].chatManager asyncSendMessage:message progress:self prepare:^(EMMessage *message, EMError *error) {
        KSLog(@"prepare %@",message.messageBodies);
    } onQueue:nil completion:^(EMMessage *message, EMError *error) {
        KSLog(@"完成 %@",message.messageBodies);
    } onQueue:nil];

顯示聊天消息:

步驟
①先獲取EMConversation 會話管理者對象
②調用EMConversation 的- (NSArray *)loadNumbersOfMessages:(NSUInteger)aCount before:(long long)timestamp;獲取指定的聊天記錄
 
監聽好友的回覆消息:
當前聊天頁面,監聽好友發送的及時消息
 
獲取歷史記錄和未讀消息數:
環信提供會話管理者(EMConversation)來管理未讀消息數和歷史聊天記錄,具體代碼以下
總的未讀消息數須要遍歷conversations
// 1.獲取全部歷史會話
   NSArray *conversations = [[EaseMob sharedInstance].chatManager conversations];
    
    // 2.若是內存中,沒有會話,從數據庫中加載
    if (conversations.count == 0) {
        conversations = [[EaseMob sharedInstance].chatManager loadAllConversationsFromDatabaseWithAppend2Chat:YES];
    }

設置消息爲已讀:

當進入聊天頁面時,須要設置全部當前會話信息或者設置已經加載的消息爲已讀
// 設置當前會話全部消息都爲已讀
[self.conversation markAllMessagesAsRead:YES];

// 設置某條消息爲已讀
 [self.conversation markMessageWithId:<#(NSString *)#> asRead:<#(BOOL)#>]

 

準備工做:

在錄音前導入環信封裝的兩個錄音框架,如圖
 
實現錄音:
剛纔導入的兩個框架,已經實現了錄音API
// 開始錄音
    [[EMCDDeviceManager sharedInstance] asyncStartRecordingWithFileName:fileName  completion:^(NSError *error){
         if (error) {
             KSLog( @"failure to start recording");
         }
     }];

    // 結束錄音
    [[EMCDDeviceManager sharedInstance] asyncStopRecordingWithCompletion:^(NSString *recordPath, NSInteger aDuration, NSError *error) {
        KSLog(@"%@",recordPath);
    }];

發送錄音:

// 語音對象
    EMChatVoice *voice = [[EMChatVoice alloc] initWithFile:filePath displayName:@"audio"];
    
    // 消息體
    EMVoiceMessageBody *body = [[EMVoiceMessageBody alloc] initWithChatObject:voice];

EMMessage *message = [[EMMessage alloc] initWithReceiver:self.buddy.username bodies:@[body]];
    message.messageType = eMessageTypeChat;// 私聊
    // 不加密
    message.requireEncryption = NO;

播放錄音:

[[EMCDDeviceManager sharedInstance] asyncPlayingWithPath:filePath completion:^(NSError *error) {
    NSLog(@"播放完成%@",error);
            }];
 
退出(異步方法):
[[EaseMob sharedInstance].chatManager asyncLogoffWithUnbindDeviceToken:YES completion:^(NSDictionary *info, EMError *error) {
  if (!error) {//退出成功
  }else{//退出失敗;
  }
} onQueue:nil];

是否使用過XMPP,XMPP的實現原理:

XMPP是一個即時通信的協議,它規範了用於即時通訊在網絡上數據傳輸格式的,好比登陸,獲取好友列表等等的格式。XMPP在網絡傳輸的數據是XML格式
好比登陸:把用戶名和密碼放在xml的標籤中,傳輸到服務器
XMPP是一個基於個Socket經過的網絡協議,目的是爲了保存長鏈接,以實現即時通信功能
XMPP的客戶端是使用一個XMPPFramework框架實現
XMPP的服務器是使用Openfire,一個開源的服務器
客戶端獲取到服務器發送過來的好友消息,客戶端須要對XML進行解析,使用的解析框架的KissXML框架,而不是NSXMLParser/GDataXML
 
 
在使用XMPP的時候有沒有須要什麼困難:
發送附件(圖片,語音,文檔…)時比較麻煩
XMPP框架沒有提供發送附件的功能,須要本身實現
實現方法,把文件上傳到文件服務器,上傳成功後獲取文件保存路徑,再把附件的路徑發送給好友
 
 
是否使用過環信,簡單的說下環信的實現原理:
環信是一個即時通訊的服務提供商
環信使用的是XMPP協議,它是再XMPP的基礎上進行二次開發,對服務器Openfire和客戶端進行功能模型的添加和客戶端SDK的封裝,環信的本質仍是使用XMPP,基本於Socket的網絡通訊
環信內部實現了數據緩存,會把聊天記錄添加到數據庫,把附件(如音頻文件,圖片文件)下載到本地,使程序員更多時間是花到用戶即時體驗上
環信內部已經實現了視頻,音頻,圖片,其它附件發送功能
環信使用公司能夠節約時間成本
不須要公司內部搭建服務器
客戶端的開發,使用環信SDK比使用XMPPFramework更簡潔方便
相關文章
相關標籤/搜索