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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

WebSocket实现实时通信

發布時間:2024/7/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebSocket实现实时通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

WebSocket 是一種數據通信協議,也是用于客戶端和服務端數據通信,類似于我們常見的 http

既然有 http,為啥還要 WebSocket
http 通信是單向的
請求 + 響應
沒有請求也就沒有響應

初次接觸 WebSocket 的人,都會問同樣的問題:我們已經有了 HTTP 協議,為什么還需要另一個協議?它能帶來什么好處?

答案很簡單,因為 HTTP 協議有一個缺陷:通信只能由客戶端發起。

舉例來說,我們想了解今天的天氣,只能是客戶端向服務器發出請求,服務器返回查詢結果。HTTP 協議做不到服務器主動向客戶端推送信息。

這種單向請求的特點,注定了如果服務器有連續的狀態變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢":每隔一段時候,就發出一個詢問,了解服務器有沒有新的信息。最典型的場景就是聊天室。

輪詢的效率低,非常浪費資源(因為必須不停連接,或者 HTTP 連接始終打開)。因此,工程師們一直在思考,有沒有更好的方法。WebSocket 就是這樣發明的。

WebSocket 協議在 2008 年誕生,2011 年成為國際標準。所有瀏覽器都已經支持了。

它的最大特點就是,服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發送信息,是真正的雙向平等對話,屬于服務器推送技術的一種。

簡單理解:

  • HTTP 打電話:
    我問一句
    你回答一句
    沒有提問就沒有回答,即便對方主動給你說話,我也是個聾子聽不見

  • WebSocket 打電話:
    雙向對話

  • HTTP 和 WebSocket 通信模型

    其他特點包括:

    (1)和 HTTP 一樣屬于應用層協議,也是建立在 TCP 協議之上,服務器端的實現比較容易。

    (2)與 HTTP 協議有著良好的兼容性。默認端口也是 80 和 443,并且握手階段(第 1 次建立連接)采用 HTTP 協議,因此握手時不容易屏蔽,能通過各種 HTTP 代理服務器。

    (3)數據格式比較輕量,性能開銷小,通信高效。

    (4)可以發送文本,也可以發送二進制數據。

    (5)沒有同源跨域限制,客戶端可以與任意服務器通信。

    WebSocket 不是用來代替 HTTP 的,它是用來解決實時通信的業務場景。如果業務不需要實時性,那就沒必要使用 WebSocket。

    WebSocket 也是有資源消耗的,因為它要實時通信,也是需要和服務端保持一定的通信連接。

    WebSocket 也是需要服務端配合才能使用。

    (6)協議標識符是ws(如果加密,則為wss),服務器網址就是 URL。

    (7)瀏覽器專門為 WebSocket 通信提供了一個請求對象 WebSocket

    XmlHttPRequest 請求對象,發起 HTTP 協議請求

    ws://example.com:80/some/pathhttp https ws wss

    使用原生 WebSocket(了解)

    參考文檔:

    MDN - WebSocket

    瀏覽器為 HTTP 通信提供了 XMLHttpRequest 對象,同樣的,也為 WebSocket 通信提供了一個通信操作接口:WebSocket。

    通信模型:

    撥號(建立連接)
    通話(雙向通信)
    結束通話(關閉連接)

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><script>// WebSocet 通信模型// 1. 撥打電話(建立連接)// 注意:wss://echo.websocket.org 是一個在線的測試接口,僅用于 WebSocket 協議通信測試使用var ws = new WebSocket("wss://echo.websocket.org");// 當連接建立成功,觸發 open 事件ws.onopen = function(evt) {console.log("建立連接成功 ...");// 連接建立成功以后,就可以使用這個連接對象通信了// send 方法發送數據ws.send("Hello WebSockets!");};// 當接收到對方發送的消息的時候,觸發 message 事件// 我們可以通過回調函數的 evt.data 獲取對方發送的數據內容ws.onmessage = function(evt) {console.log("接收到消息: " + evt.data);// 當不需要通信的時候,可以手動的關閉連接// ws.close();};// 當連接斷開的時候觸發 close 事件ws.onclose = function(evt) {console.log("連接已關閉.");} </script> </body> </html>


    怎么查看 WebSocket 請求日志?

    朝上的綠色箭頭是發出去的消息

    朝下的紅色箭頭是收到的消息

    總結

    以上是生活随笔為你收集整理的WebSocket实现实时通信的全部內容,希望文章能夠幫你解決所遇到的問題。

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