socketio必須用在node中;socketio是nodejs的一個(gè)庫,利用nodejs的函數(shù)封裝了一些功能,并且依賴于nodejs的一些api,所以只能在nodejs中使用,socketio也是在客戶端和服務(wù)端之間建立的雙向通信數(shù)據(jù)交換技術(shù),底層使用EngineIO。
本文操作環(huán)境:Windows10系統(tǒng)、nodejs 16版、Dell G3電腦。
socketio必須用在node中
socketio是nodejs的一個(gè)庫,相當(dāng)于別人利用nodejs的函數(shù)封裝了一些功能給你使用,依賴與nodejs的一些api,所以只能在nodejs下用。
SocketIO是在客戶端和服務(wù)端之間建立的雙向通信數(shù)據(jù)交換技術(shù),底層使用EngineIO。SocketIO的的客戶端使用Engine.IO-Client,服務(wù)端使用Engine.IO實(shí)現(xiàn)。
擴(kuò)展知識
SocketIO如何工作
當(dāng)一個(gè)瀏覽器嘗試建立SocketIO時(shí),SocketIO首先使用xhr-polling創(chuàng)建一個(gè)長輪詢。長輪詢一旦建立,它將升級為WebSocket連接。
SocketIO底層是使用EngineIO庫實(shí)現(xiàn)的,這個(gè)庫使用WebSocket和XMLHttprequest封裝了一套自己的Socket協(xié)議(暫時(shí)叫 EIO Socket)。一個(gè)完整的 EIO Socket 包括多個(gè) XHR 和 WebSocket 連接.
客戶端
EIO Socket 通過一個(gè) XHR (XMLHttprequest) 握手。前端發(fā)送一個(gè) XHR,告訴服務(wù)端我要開始 XHR 長輪詢了。后端返回的數(shù)據(jù)里面包括一個(gè) open 標(biāo)志(數(shù)字 0 表示), 以及sid 和 upgrades 字段,ping時(shí)間間隔,ping超時(shí)時(shí)間。
0{ “sid”: “8b7ab1ae-fbcf-4d23-8192-3c14a2a90721”, “upgrades”: [ “websocket” ], “pingInterval”: 10000, “pingTimeout”: 60000 }
sid 是本次 EIO Socket 的會(huì)話 ID,因?yàn)橐淮?EIO Socket 包含了多個(gè)請求,而后端又會(huì)同時(shí)連接多個(gè) EIO Socket,sid 的作用就相當(dāng)于 SESSION ID。
另一個(gè)字段 upgrades,正常情況下是 [‘websocket’],表示可以把連接方式從長輪詢升級到 WebSocket。
前端在發(fā)送第一個(gè) XHR 的時(shí)候就開始了 XHR 長輪詢,這個(gè)時(shí)候如果有收發(fā)數(shù)據(jù)的需求,是通過長輪詢實(shí)現(xiàn)的。所謂長輪詢,是指前端發(fā)送一個(gè) request,服務(wù)端會(huì)等到有數(shù)據(jù)需要返回時(shí)再 response. 前端收到 response 后馬上發(fā)送下一次 request。這樣就可以實(shí)現(xiàn)雙向通信。
前端收到握手的 upgrades 后,EIO 會(huì)檢測瀏覽器是否支持 WebSocket,如果支持,就會(huì)啟動(dòng)一個(gè) WebSocket 連接,然后通過這個(gè) WebSocket 往服務(wù)器發(fā)一條內(nèi)容為 probe, 類型為 ping 的數(shù)據(jù)。如果這時(shí)服務(wù)器返回了內(nèi)容為 probe, 類型為 pong 的數(shù)據(jù),前端就會(huì)把前面建立的 HTTP 長輪詢停掉,后面只使用 WebSocket 通道進(jìn)行收發(fā)數(shù)據(jù)
EIO Socket 生命周期內(nèi),會(huì)間隔一段時(shí)間 ping – pong 一次,用來測試網(wǎng)絡(luò)是否正常。
這是 WebSocket 幀的結(jié)構(gòu),綠色是發(fā)送,白色是接收。前面的數(shù)字是數(shù)據(jù)包類型,2 是 ping, 3 是 pong, 42是 message
推薦學(xué)習(xí):《nodejs視頻教程》