一.為什么需要 WebSocket?
首先需要知道WebSocket 是一種網絡通信協議,很多高級功能都需要它。初次接觸 WebSocket 的人,都會問同樣的問題:我們已經有了 HTTP 協議,為什么還需要另一個協議?它能帶來什么好處?答案很簡單,因為 HTTP 協議有一個缺陷:通信只能由客戶端發起。
舉例來說,我們想了解今天的天氣,只能是客戶端向服務器發出請求,服務器返回查詢結果。HTTP 協議做不到服務器主動向客戶端推送信息。
這種單向請求的特點,注定了如果服務器有連續的狀態變化,客戶端要獲知就非常麻煩。我們只能使用“輪詢”:每隔一段時候,就發出一個詢問,了解服務器有沒有新的信息。最典型的場景就是聊天室。但是輪詢的效率低,非常浪費資源(因為必須不停連接,或者 HTTP 連接始終打開)。因此,WebSocket 就是應用而生了。
二.WebSocket簡介
WebSocket 協議在2008年誕生,2011年成為國際標准。所有瀏覽器都已經支持了。
它的最大特點就是,服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發送信息,是真正的雙向平等對話,屬於服務器推送技術的一種。
其他特點包括:
(1)建立在 TCP 協議之上,服務器端的實現比較容易。
(2)與 HTTP 協議有着良好的兼容性。默認端口也是80和443,並且握手階段采用 HTTP 協議,因此握手時不容易屏蔽,能通過各種 HTTP 代理服務器。
(3)數據格式比較輕量,性能開銷小,通信高效。
(4)可以發送文本,也可以發送二進制數據。
(5)沒有同源限制,客戶端可以與任意服務器通信。
(6)協議標識符是ws
(如果加密,則為wss
),服務器網址就是 URL。
ws://example.com:80/some/path
三.webSocket 握手協議
在WebSocket API 中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。webSocket請求和通常的 HTTP 請求很相似,但是其中有些內容是和 WebSocket 協議密切相關的。我們需要簡單介紹一下這些請求和應答信息,”Upgrade:WebSocket”表示這是一個特殊的 HTTP 請求,請求的目的就是要將客戶端和服務器端的通訊協議從 HTTP 協議升級到 WebSocket 協議。從客戶端到服務器端請求的信息里包含有”Sec-WebSocket-Key”這樣的頭信息。這是客戶端瀏覽器需要向服務器端提供的握手信息,服務器端解析這些頭信息,並在握手的過程中依據這些信息生成一個 16 位的安全密鑰並返回給客戶端,以表明服務器端獲取了客戶端的請求,同意創建 WebSocket 連接。一旦連接建立,客戶端和服務器端就可以通過這個通道雙向傳輸數據了。
四.webscoket的屬性、方法和事件
五.使用python進行websocket接口測試
需要安裝websocket的模塊
pip install websocket-client
由於目前我們還沒有一個適用的 WebSocket 服務器環境配置於本地,所以可以借助於網站:http://www.websocket.org/echo.html 來幫助我們完成一個簡單的 WebSocket 通信。打開Fiddler 對瀏覽器進行監控,然后打開該網頁,點擊Connect按鈕可以通過 WebSocket 協議連接到其服務器ws://echo.websocket.org。當日志顯示連接成功后(即顯示:CONNECTED),在Message 文本框內輸入任意內容發送,發送后再點擊Disconnect關閉連接。
在 Fidder 中只監控到一個 HTTP 請求。這一個請求即為 WebSocket 借助於 HTTP 協議建立與服務器連接的請求,而連接建立成功后,發送消息和接受響應的 WebSocket 本身的協議請求,則不會在 Fidder 中形成新的請求,而是直接基於該請求下進行不停地 Ping/Pong 操作和發送數據。
使用python完成剛才的測試
import websocket,json url = 'ws://echo.websocket.org/?encoding=text' #websocket連接地址 ws = websocket.create_connection(url) #創建連接 ws.send("這是webservice測試") #json轉化為字符串,必須轉化 print(ws.recv()) #服務器響應數據 ws.close() #關閉連接