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