前言 在直播中,聊天和發(fā)禮物,需要用到及時通訊技術(shù),市面上的App大多數(shù)采用的都是第三方SDK,融云,環(huán)信等,但是本例子采用websocket搭建及時通訊服務(wù)器。 即時通訊 即時通訊(Instant messaging,簡稱IM)是一個終端服務(wù),允許兩人或多人使用網(wǎng)路即時的傳遞文字訊息、檔案、語音與視頻交流 即時通訊技術(shù)原理(了解Socket) 即時通訊技術(shù)實現(xiàn) WebSocket 什么是websocket?是 HTML5 一種新的協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實時通訊,它建立在 TCP 之上,同 HTTP 一樣通過 TCP 來傳輸數(shù)據(jù) WebSocket 是一種雙向通信協(xié)議,在建立連接后,WebSocket 服務(wù)器和 客戶端 都能主動的向?qū)Ψ桨l(fā)送或接收數(shù)據(jù),就像 Socket 一樣。 WebSocket 需要類似 TCP 的客戶端和服務(wù)器端通過握手連接,連接成功后才能相互通信 websocket提供兩種數(shù)據(jù)傳輸:文本數(shù)據(jù)和二進(jìn)制數(shù)據(jù) websocket協(xié)議頭:ws
WebSocket原理 響應(yīng)頭 Socket.IO簡介 WebSocket的功能是很強(qiáng)大的,使用起來也靈活,可以適用于不同的場景。不過WebSocket技術(shù)也比較復(fù)雜,需要加密解密,包裝協(xié)議,自己實現(xiàn)3次握手,還需要對數(shù)據(jù)流進(jìn)行加密解密處理,服務(wù)器端和瀏覽器端的實現(xiàn)都不同于一般的Web應(yīng)用,因此自己實現(xiàn)很麻煩,可以使用Socket.IO框架。 Socket.IO:是一個完全由JavaScript實現(xiàn)、基于Node.js、支持WebSocket的協(xié)議用于實時通信、跨平臺的開源框架。 Socket.IO:它包括了客戶端(iOS,Android)和服務(wù)器端(Node.js)的代碼,可以很好的實現(xiàn)iOS即使通訊技術(shù)。 Socket.IO框架地址: https://github.com/socketio
Socket.IO教程 Socket.IO建立連接 服務(wù)器代碼 2.如何創(chuàng)建socket 3.如何建立socket連接(服務(wù)器不需要主動建立連接,建立連接是客戶端的事情,服務(wù)器只需要監(jiān)聽連接) 客戶端主動連接會發(fā)送connection事件,只需要監(jiān)聽connection事件有沒有發(fā)送,就知道客戶端有沒有主動連接服務(wù)器 Socket.IO本質(zhì)是通過發(fā)送和接受事件 觸發(fā)服務(wù)器和客戶端之間的通訊,任何能被編輯成JSON或二進(jìn)制的對象都可以傳遞。 監(jiān)聽事件,用socket.on,這個方法會有兩個參數(shù),第一個參數(shù)是事件名稱,第二個參數(shù)是監(jiān)聽事件的回調(diào)函數(shù),監(jiān)聽到就會執(zhí)行這個回調(diào)函數(shù) 監(jiān)聽connection,回調(diào)函數(shù)會傳入一個連接好的socket,這個socket就是客戶端的socket socket連接原理,就是客戶端和服務(wù)端通過socket連接,服務(wù)器有socket,客戶端也有
Socket.IO建立連接 客戶端代碼 1.下載Socket.IO-Client-Swift 2.下載完了,直接把Source文件夾拖入到自己工程中. 3.OC和Swift混編,Swift代碼怎么在OC中使用,直接導(dǎo)入”工程文件名-Swift.h”就可以使用,這個文件Xcode會自動幫我們生成,無序手動自己生成.
4.注意工程文件名不能帶有-這個符號,而且有時候會延遲,并不是馬上導(dǎo)入”工程文件名-Swift.h”就好. 5.創(chuàng)建socket對象,然后連接用connect方法,socket對象需要強(qiáng)引用
6.因為需要進(jìn)行3次握手,不可能馬上建議連接,需要監(jiān)聽是否連接成功的回調(diào),使用on方法 7.ON方法兩個參數(shù)(第一個參數(shù),監(jiān)聽的事件名稱,第二個參數(shù):監(jiān)聽事件回調(diào)函數(shù),會自動調(diào)用)
SocketIO發(fā)送事件,通過事件傳遞數(shù)據(jù) SocketIO 客戶端發(fā)送事件代碼 SocketIO 服務(wù)器監(jiān)聽事件代碼 監(jiān)聽客戶端事件,需要嵌套在連接好的connect回調(diào)函數(shù)中 必須使用回調(diào)函數(shù)的socket參數(shù),如function(s)中的s,監(jiān)聽事件,因此這是客戶端的socket,肯定監(jiān)聽客戶端發(fā)來的事件 服務(wù)器監(jiān)聽連接的回調(diào)函數(shù)的參數(shù)可以添加多個,具體看客戶端傳遞數(shù)據(jù)數(shù)組有幾個,每個參數(shù)都是與客戶段一一對應(yīng),第一個參數(shù)對應(yīng)客戶端數(shù)組第0個數(shù)據(jù)
SocketIO 服務(wù)器發(fā)送事件代碼 SocketIO 客戶端監(jiān)聽事件代碼 SocketIO分組 開發(fā)中什么場景需要使用SocketIO分組?(T) 一個客戶端和服務(wù)器只會保持一個socket連接,比如直播App中會開很多主播房間,每個房間都有自己的聊天室,不可能每個聊天室都建立一個socket,但如果只有一個socket,比如A用戶要給A主播間發(fā)送信息,怎么推送過去,通過服務(wù)器只能給當(dāng)前客戶端推送,那一推,當(dāng)前客戶端所有直播間都有A用戶的信息。 怎么解決多個直播聊天室問題? 給每個主播的房間都分組,服務(wù)器就可以給指定組推送數(shù)據(jù),就不會影響到其他直播間 SocketIO如何分組? 服務(wù)器代碼: socket.join(),()里面放分組名稱,與之對應(yīng)的 socket.leave() 注意這里的socket是客戶端的socket,也就是連接成功,傳遞過來的socket
socket分組的原理 ,只要客戶端socket調(diào)用join,服務(wù)器就會把客戶端socket和分組的名稱綁定起來,到時候就可以根據(jù)分組的名稱找到對應(yīng)客戶端的socket,就能給指定的客戶端推送信息.
注意:一個客戶端socket只能添加到一組,離開的時候,要記得移除. 客戶端可以這樣測試,搞兩臺電腦/兩臺手機(jī)在同一個局域網(wǎng)內(nèi),運(yùn)行就有兩個客戶端,分別加入不同組. 服務(wù)器只給一個客戶端socket發(fā)送信息,另外一個客戶端收不到 服務(wù)器代碼
內(nèi)容下載和更多交流,盡在bbs.520it.com
|