小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

 明滅的煙頭 2018-07-25

前言

在直播中,聊天和發(fā)禮物,需要用到及時通訊技術(shù),市面上的App大多數(shù)采用的都是第三方SDK,融云,環(huán)信等,但是本例子采用websocket搭建及時通訊服務(wù)器。

即時通訊

即時通訊(Instant messaging,簡稱IM)是一個終端服務(wù),允許兩人或多人使用網(wǎng)路即時的傳遞文字訊息、檔案、語音與視頻交流

即時通訊技術(shù)原理(了解Socket)

  • Socket介紹: 套接字或者插座,用于描述IP地址和端口號,是一種網(wǎng)絡(luò)的通信機(jī)制。

  • Socket作用: 網(wǎng)絡(luò)通信底層都是通過socket建立連接的,因為它包含IP和端口,只要有這兩個就能準(zhǔn)確找到一臺主機(jī)上的某個應(yīng)用。

  • IM通信原理(T):

    • 客戶端A與客戶端B如何產(chǎn)生通信?客戶端A不能直接和客戶端B,因為兩者相距太遠(yuǎn)。

    • 這時就需要通過IM服務(wù)器,讓兩者產(chǎn)生通信.

    • 客戶端A通過socket與IM服務(wù)器產(chǎn)生連接,客戶端B也通過socket與IM服務(wù)器產(chǎn)生連接

    • A先把信息發(fā)送給IM應(yīng)用服務(wù)器,并且指定發(fā)送給B,服務(wù)器根據(jù)A信息中描述的接收者將它轉(zhuǎn)發(fā)給B,同樣B到A也是這樣。

    • 通訊問題: 服務(wù)器是不能主動連接客戶端的,只能客戶端主動連接服務(wù)器

    • 那么當(dāng)服務(wù)器要推信息給客戶端B,但是客戶端B這時候沒有與服務(wù)器產(chǎn)生連接,就推送不了.

    • 這樣就延遲,不即時了。

即時通訊技術(shù)實現(xiàn)

  • 即時通訊核心是`即時``,那怎么達(dá)到即時?

    • 目前實現(xiàn)即時通訊的有四種方式(短輪詢、長輪詢、SSE、Websocket)

    • 短輪詢: 每隔一小段時間就發(fā)送一個請求到服務(wù)器,服務(wù)器返回最新數(shù)據(jù),然后客戶端根據(jù)獲得的數(shù)據(jù)來更新界面,這樣就間接實現(xiàn)了即時通信。優(yōu)點是簡單,缺點是對服務(wù)器壓力較大,浪費(fèi)帶寬流量(通常情況下數(shù)據(jù)都是沒有發(fā)生改變的)。

    • 短輪詢: 主要是客戶端人員寫代碼,服務(wù)器人員比較簡單,適于小型應(yīng)用

    • 長輪詢: 客戶端發(fā)送一個請求到服務(wù)器,服務(wù)器查看客戶端請求的數(shù)據(jù)(服務(wù)器中數(shù)據(jù))是否發(fā)生了變化(是否有最新數(shù)據(jù)),如果發(fā)生變化則立即響應(yīng)返回,否則保持這個連接并定期檢查最新數(shù)據(jù),直到發(fā)生了數(shù)據(jù)更新或連接超時。同時客戶端連接一旦斷開,則再次發(fā)出請求,這樣在相同時間內(nèi)大大減少了客戶端請求服務(wù)器的次數(shù).

    • 長輪詢底層實現(xiàn):在服務(wù)器的程序中加入一個死循環(huán),在循環(huán)中監(jiān)測數(shù)據(jù)的變動。當(dāng)發(fā)現(xiàn)新數(shù)據(jù)時,立即將其輸出給瀏覽器并斷開連接,瀏覽器在收到數(shù)據(jù)后,再次發(fā)起請求以進(jìn)入下一個周期

    • 長輪詢弊端:服務(wù)器長時間連接會消耗資源,返回數(shù)據(jù)順序無保證,難于管理維護(hù)

    • 長輪詢處理:不能一直持續(xù)下去,應(yīng)該設(shè)定一個最長時限,可以通過心跳包的方式,設(shè)置多少秒沒有接到心跳包,就關(guān)閉當(dāng)前連接。

    • 心跳包:就是在客戶端和服務(wù)器間定時通知對方自己狀態(tài)的一個自己定義的命令字,按照一定的時間間隔發(fā)送,類似于心跳,所以叫做心跳包

    • SSE(Server-sent Events服務(wù)器推送事件):為了解決瀏覽器只能夠單向傳輸數(shù)據(jù)到服務(wù)端,HTML5提供了一種新的技術(shù)叫做服務(wù)器推送事件SSE,SSE技術(shù)提供的是從服務(wù)器單向推送數(shù)據(jù)給瀏覽器的功能,但是配合瀏覽器主動請求,實際上就實現(xiàn)了客戶端和服務(wù)器的雙向通信.

    • WebSocket:上面的這些解決方案中,都是利用瀏覽器單向請求服務(wù)器或者服務(wù)器單向推送數(shù)據(jù)到瀏覽器,而在HTML5中,為了加強(qiáng)web的功能,提供了websocket技術(shù),它不僅是一種web通信方式,也是一種應(yīng)用層協(xié)議。它提供了瀏覽器和服務(wù)器之間原生的全雙工跨域通信,通過瀏覽器和服務(wù)器之間建立websocket連接,在同一時刻能夠?qū)崿F(xiàn)客戶端到服務(wù)器和服務(wù)器到客戶端的數(shù)據(jù)發(fā)送.

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原理

  • Websocket流程: WB是先進(jìn)行一次HTTP請求,這個請求頭不同于普通HTTP請求,然后服務(wù)器開始辨認(rèn)請求頭,如果是WB的請求頭,則開始進(jìn)行普通的TCP連接,即三次握手。如果不是WB的HTTP請求頭,那就是按普通的HTTP請求處理

  • Websocket協(xié)議解析:

  • 請求頭

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

響應(yīng)頭

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

    • Sec-WebSocket-Key:其值采用base64編碼的隨機(jī)16字節(jié)長的字符序列

    • Sec-WebSocket-Accept如何生成:http://www.cnblogs.com/hustskyking/p/websocket-with-node.html

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ù)器代碼

  • 1.如何導(dǎo)入Socket.IO?

    • 和導(dǎo)入express框架一樣,使用package

    • 給package文件添加依賴

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

2.如何創(chuàng)建socket

  • socket本質(zhì)還是http協(xié)議,所以需要綁定http服務(wù)器,才能啟動socket服務(wù).

  • 而且需要通過web服務(wù)器監(jiān)聽端口,socket不能監(jiān)聽端口,有人訪問端口才能建立連接,所以先創(chuàng)建web服務(wù)器

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

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,客戶端也有

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

    • 書寫客戶端代碼,驗證是否能建立連接

Socket.IO建立連接 客戶端代碼

  • 1.下載Socket.IO-Client-Swift

    • Socket.IO只有swift,如果需要用OC代碼,需要swift和OC混編

    • 還有如果代碼是OC,并且使用cocoapods,就不要使用cocoapods導(dǎo)入swift代碼,會有問題.

  • 2.下載完了,直接把Source文件夾拖入到自己工程中.

    • 會報錯,說當(dāng)前swift版本過時,需要更新。點擊Xcode頂部Edit => Convert => TO Current Swift Syntas 就好了。

  • 3.OC和Swift混編,Swift代碼怎么在OC中使用,直接導(dǎo)入”工程文件名-Swift.h”就可以使用,這個文件Xcode會自動幫我們生成,無序手動自己生成.

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

  • 4.注意工程文件名不能帶有-這個符號,而且有時候會延遲,并不是馬上導(dǎo)入”工程文件名-Swift.h”就好.

  • 5.創(chuàng)建socket對象,然后連接用connect方法,socket對象需要強(qiáng)引用

    • 注意協(xié)議:ws開頭

    • 創(chuàng)建socket對象,需要傳入字典,字典配置如下。

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

  • 6.因為需要進(jìn)行3次握手,不可能馬上建議連接,需要監(jiān)聽是否連接成功的回調(diào),使用on方法

  • 7.ON方法兩個參數(shù)(第一個參數(shù),監(jiān)聽的事件名稱,第二個參數(shù):監(jiān)聽事件回調(diào)函數(shù),會自動調(diào)用)

    • 回調(diào)函數(shù)也有兩個參數(shù)(第一個參數(shù):服務(wù)器傳遞的數(shù)據(jù) 第二個參數(shù):確認(rèn)請求數(shù)據(jù))

    • 在TCP/IP協(xié)議中,如果接收方成功的接收到數(shù)據(jù),那么會回復(fù)一個ACK數(shù)據(jù)。

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

SocketIO發(fā)送事件,通過事件傳遞數(shù)據(jù)

SocketIO 客戶端發(fā)送事件代碼

  • 注意:只有連接成功之后,才能發(fā)送事件

  • 向服務(wù)器發(fā)送事件(emit:第一參數(shù)事件的名稱,第二個參數(shù)傳輸?shù)臄?shù)據(jù),是一個數(shù)組)

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

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ù)

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

SocketIO 服務(wù)器發(fā)送事件代碼

  • 這里的socket一定要用服務(wù)器端的socket

  • 給當(dāng)前客戶端發(fā)送數(shù)據(jù),其他客戶端收不到.

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

  • 發(fā)給所有客戶端,不包含當(dāng)前客戶端

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

  • 發(fā)給所有客戶端,包含當(dāng)前客戶端

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

SocketIO 客戶端監(jiān)聽事件代碼

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

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ù)器代碼

搭建即時通訊服務(wù)器WebSocket,挺容易嘛

內(nèi)容下載和更多交流,盡在bbs.520it.com

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多