日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Socket.io 深入理解

發布時間:2023/12/2 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Socket.io 深入理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在做項目優化工作時,用到了Socket.io , Socket.io 文檔比較少, 結合官網介紹以及自己在項目開發中的摸索,總結如下內容;

Socket.io將Websocket和輪詢 (Polling)機制以及其它的實時通信方式封裝成了通用的接口,并且在服務端實現了這些實時機制的相應代碼。也就是說,Websocket僅僅是Socket.io實現實時通信的一個子集;

Socket.io 支持如下方式的通信方式,根據瀏覽器的支持程度,自動選擇使用哪種技術進行通信:

  • WebSocket
  • Flash Socket
  • AJAX long-polling
  • AJAX multipart streaming
  • Forever IFrame
  • JSONP polling

Socket.io 底層是 Engine.io; Engine.io作為Socket.io的服務器和瀏覽器之間交換的數據的傳輸層,實現了跨平臺的雙向通信。但是它不會取代Socket.io,它只是抽象出固有的復雜性,支持多種瀏覽器,設備和網絡的實時數據交換。

Engine.io使用了 WebSocket 和 XMLHttprequest(或JSONP) 封裝了一套自己的 Socket 協議(暫時叫 EIO Socket),在低版本瀏覽器里面使用長輪詢替代 WebSocket。一個完整的 EIO Socket 包括多個 XHR 和 WebSocket 連接.

下面從前后端的實現原理上來說明;

前端

EIO Socket 通過一個 XHR (XMLHttprequest) 握手。前端發送一個 XHR,告訴服務端我要開始 XHR 長輪詢了。后端返回的數據里面包括一個 open 標志(數字 0 表示), 以及一個 sid 、 upgrades 、pingInterval、pingTimeout四個字段;

sid

sid 是本次 EIO Socket 的會話 ID,因為一次 EIO Socket 包含了多個請求,而后端又會同時連接多個 EIO Socket,sid 的作用就相當于 SESSION ID;

upgrades

會話升級得字符串,正常情況下是 ['websocket'],表示可以把連接方式從長輪詢升級到 WebSocket.

pingInterval

設定每隔在一定時間發送一個ping包,可以用于心跳包的設置。默認為25000

pingTimeout

Server配置的ping超時時間,默認60000

前端在發送第一個 XHR 的時候就開始了 XHR 長輪詢,這個時候如果有收發數據的需求,是通過長輪詢實現的。所謂長輪詢,是指前端發送一個 request,服務端會等到有數據需要返回時再 response. 前端收到 response 后馬上發送下一次 request。這樣就可以實現雙向通信。

前端收到握手的 upgrades 后,EIO 會檢測瀏覽器是否支持 WebSocket,如果支持,就會啟動一個 WebSocket 連接,然后通過這個 WebSocket 往服務器發一條內容為 probe, 類型為 ping 的數據。如果這時服務器返回了內容為 probe, 類型為 pong 的數據,前端就會把前面建立的 HTTP 長輪詢停掉,后面只使用 WebSocket 通道進行收發數據。

EIO Socket 生命周期內,會間隔一段時間 (默認25000毫秒)ping - pong 一次,用來測試網絡是否正常;

下圖是WebSocket 幀的結構

綠色是發送,白色是接收。前面的數字是數據包類型,2 是 ping, 3 是 pong, 4 是 message.

服務端

服務端使用 ws 庫實現 WebSocket 協議。Socket.io服務啟動時,會先啟動一個 ws 服務。Socket.io 會監聽 HTTP 服務器的 upgrade 和 request 事件。當 upgrade 事件觸發時,說明可能是 WebSocket 握手,先簡單校驗下,然后把請求交給 ws 服務進行處理,拿到 WebSocket 對象。當 request 事件觸發時,根據 url 路徑判斷是不是 Socket.io的 XHR 請求,拿到 res 和 res 對象。這樣就可以正確接收和返回客戶端數據了,具體處理過程和前端部分是對應的。


更多專業前端知識,請上 【猿2048】www.mk2048.com

總結

以上是生活随笔為你收集整理的Socket.io 深入理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。