WebSocket
特點
WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議。簡單來說,它就像是在客戶端和服務器之間建立了一條"專用通道",雙方可以隨時主動發送消息給對方,而不需要像HTTP那樣總是由客戶端發起請求。
- 同一時間、雙向同時傳輸的通信方式。
例如:
HTTP
就像是傳統的郵件往來——你給朋友寫信,必須等朋友回信后才能知道他的想法。WebSocket
就像是電話通話——雙方可以隨時說話,隨時聽到對方的回應,交流更加自然流暢。
與 http 的區別
HTTP
協議的交互過程,是非常典型的“一問一答”
- 單向性,只能由客戶端主動發起請求
- 無狀態性,每次請求都是獨立的
- 短連接,一次請求完成后連接就會斷開
這種設計在傳統的網頁瀏覽場景下工作得很好,但當我們需要服務器主動推送數據時就會遇到問題。比如-
- 如果要實現一個實時消息對話功能,使用
HTTP
的話,前端只能不斷地輪詢服務器:"有新數據嗎?有新數據嗎?"這種方式不僅浪費資源,還存在明顯的延遲。
WebSocket
從根本上解決了這個問題。它通過 HTTP
握手建立連接后,就會升級為 WebSocket
協議,形成一個持久的全雙工通信通道。服務器可以隨時主動推送數據,客戶端也可以隨時發送數據,雙方的地位是平等的
使用場景
雖然 WebSocket
有很多優勢,但并不意味著它應該完全取代 HTTP
。選擇使用哪種協議主要取決于具體的應用場景
- 如果需要頻繁的雙向數據交換,比如在線聊天、多人游戲、協作編輯、實時監控等,
WebSocket
是最佳選擇。它能夠提供近乎即時的響應速度,用戶體驗會顯著提升 - 如果只是普通的網頁瀏覽、API 調用、文件上傳下載等場景,
HTTP
仍然是更好的選擇。HTTP
協議更簡單、更穩定,也更容易調試和緩存。而且,現代瀏覽器對HTTP
的優化已經相當成熟
跨域問題
同源策略
瀏覽器出于安全考慮,實施的一種策略
- 只允許來自同一源(即協議+域名+端口都相同)的請求訪問,否則就會導致跨域問題
例如:
http://xxxx.com
——>https://xxxx.com
:存在跨域,協議不同127.x.x.x:8001
——>127.x.x.x:8002
:存在跨域,端口不同www.xxxx.com
——>www.yyyy.com
:存在跨域,域名不同
解決辦法
找一個中間人——配置一個代理服務器
前端直接請求后端接口的話,肯定越不過同源策略,會造成跨域問題。因為前端服務端口和后端服務端口肯定是不一樣的。
我們可以配置一個代理服務器,前端有請求之后,先請求和其同源的代理服務器,然后再去請求后端服務
- 因為服務器不受同源策略的影響