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