iOS之即時通訊相關理解

來源:互聯網
上載者:User

標籤:ram   即時通訊   而不是   isp   下載到本地   connect   官方   服務   協議   

Socket:

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(使用者資料包通訊協定)

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 5288telnet命令是串連伺服器上的某個連接埠對應的服務  轉寄Message Service:多個用戶端串連到伺服器當一個用戶端發送Message Service器時,伺服器轉寄給其它已經串連的用戶端。相當於一個群聊的雛形  Socket層上的協議:Socket層上的協議指的資料轉送的格式1>HTTP協議

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

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

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

  可擴充訊息處理現場協議)是基於可延伸標記語言 (XML)(XML)的協議,它用於立即訊息(IM)以及線上現場探測。這個協議可能最終允許網際網路使用者向網際網路上的其他任何人傳送立即訊息

  傳輸格式:

  <from>zhangsan<from>

   <to>lisi<to>

   <body>一起吃晚上</body>

2>自訂即時通訊協議,json格式

{

“from”:”zhangsan”,

”to”:”lisi”,

”body”:”中午一起吃飯”

}

 

即時通訊 :即時通訊,又稱即時通訊

即時通訊(Instant Messaging,簡稱IM)是一個即時通訊系統,允許兩人或多人使用網路即時的傳遞文字訊息、檔案、語音與視頻交流即時通訊在開發中使用的情境開發一個類型於,QQ,易信的聊天軟體在電商APP整合買家與賣家的即時溝通等當前時下,實現即時通訊的方案1.XMPP2.環信  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.com2>在開發人員後台建立APP擷取Key3>下載官方SDK DEMOhttp://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更簡潔方便

iOS之即時通訊相關理解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.