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 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];
[[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更簡潔方便