因為我之前對
WebSocket
接口也不是很了解,所以本篇文章先簡單的概括的說明一下WebSocket
的相關概念。在文章的后半部分,進行測試WebSocket
接口的步驟說明。
1、什么是WebSocket接口
WebSocket
是一種網絡通信協議。
我們在上網過程中經常用到的是HTTP和HTTPS協議,HTTP協議和HTTPS協議的通信過程,通常是客戶端通過瀏覽器發出一個請求,服務器按受請求后進行處理並返回結果給客戶端,客戶端接收響應的結果。
這種機制對於信息變化不是特別頻繁的應用,可以良好支撐。但對於實時信息要求高、海量並發的應用來說,顯得捉襟見肘。尤其在移動互聯網蓬勃發展的趨勢下,高並發與用戶實時響,應是Web應用經常面臨的問題。比如金融證券的實時信息、社交網絡的實時消息推送、網絡直播等。
Websocket
通信協議出現前我們實現推送技術,用的都是輪詢,在特定的時間間隔,瀏覽器自動發出請求,將服務器的消息主動的拉回來。這種情況下,我們需要不斷的向服務器發送請求,這樣會占用很多的帶寬和服務器資源,並且服務器不能主動向客戶端推送數據。在這種情況下需要一種高效節能的雙向通信機制,來保證數據的實時傳輸,於是基於HTML5規范的WebSocket
網絡通信協議應運而生。
WebSocket
是類似Socket的TCP長連接通訊模式。一旦WebSocket
連接建立后,后續數據都以幀序列的形式傳輸。在客戶端斷開WebSocket
連接或Server端中斷連接前,不需要客戶端和服務端重新發起連接請求。在海量並發,及客戶端與服務器交互負載流量大的情況下,極大的節省了網絡帶寬資源的消耗,有明顯的性能優勢,且客戶端發送和接受消息是在同一個持久連接上發起,實時性優勢明顯。
2、為什么需要WebSocket
初次接觸 WebSocket
的人,都會問同樣的問題:我們已經有了HTTP協議,為什么還需要另一個協議?它能帶來什么好處?
答案很簡單,因為HTTP協議有一個缺陷:通信只能由客戶端發起。
舉例來說,我們想了解今天的天氣,只能是客戶端向服務器發出請求,服務器返回查詢結果。HTTP協議做不到服務器主動向客戶端推送信息。
這種單向請求的特點,注定了如果服務器有連續的狀態變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢",每隔一段時候,就發出一個詢問,了解服務器有沒有新的信息。輪詢的效率低,非常浪費資源。因此,工程師們一直在思考,有沒有更好的方法,WebSocket
就是這樣發明的。
WebSocket
的最大特點就是,服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發送信息,是真正的雙向平等對話,屬於服務器推送技術的一種。
WebSocket
是雙向的,在客戶端和服務器通信的場景中使用的全雙工協議,與HTTP
不同,它以ws://
或wss://
開頭。它是一個有狀態協議,這意味着客戶端和服務器之間的連接將保持活動狀態,直到被任何一方(客戶端或服務器)終止,WebSocket
連接才從兩端終止。
3、測試WebService接口前的准備
在JMeter中測試WebSocket
協議的接口,需要先安裝WebSocket
插件和依賴包。
打開JMeter中的插件管理器:選項 —> Plugins Manager
。
提示:沒有安裝JMeter插件管理器的,請點擊后面文章鏈接:【JMeter插件管理器的安裝與使用】
打開JMeter插件管理器后,點擊Available Plugins
選項頁,在搜索框中輸入WebSocket
,然后選擇安裝WebSocket Sampler by Maciej Zaleski
插件。
我們可以從上圖中看到在插件的說明中,該插件包含websocket-api.jar
、websocket-common.jar
、websocket-client.jar
、jetty-http.jar
、jetty-io.jar
、jetty-util.jar
這6個JAR包。
這些JAR包可以使JMeter中的取樣器,發送支持WebSocket
協議的請求。
如下圖所示:
提示:安裝完
WebSocket Sampler by Maciej Zaleski
插件后需要重啟JMeter。
4、WebSocket Sampler組件界面詳解
WebSocket Sampler
組件添加方式:選中“線程組”右鍵 —> 添加 —> 取樣器 —> WebSocket Sampler
。
界面如下圖所示:
針對界面中各選項說明:
- 名稱:
WebSocket Sampler
組件的自定義名稱,見名知意最好。 - 注釋:即添加一些備注信息,對該
WebSocket Sampler
組件的簡短說明,以便后期回顧時查看。
(1)WebServer
Server Name or IP
:發送請求的目標服務器的IP地址或者域名。Port Number
:服務器地址后的端口號,有則填寫,沒有不用填寫。
(2)Timeout (milliseconds)
Connection
:鏈接建立的最大超時時間,單位毫秒。如果達到超時時間設置后鏈接未建立,則sampler失敗。Response
:對響應消息的最大等待時間,單位毫秒。到達設定時間后WebSocket鏈接關閉。
(3)WebSocket Request
Implementation
:只支持RFC6455(v13) ,WebSocket協議標准的最新版。Protocol
:有ws
與wss
之分。ws
前綴是WebSocket連接的辨別標識,wss
前綴是WebSocket安全連接的辨別標識。根據自己需要訪問接口的實際情況填寫。Content encoding
:內容編碼。有中文推薦編寫UTF-8。Connection Id
:連接ID。Path
:訪問接口的路徑。Ignore SSL certificate errors
:忽略SSL證書錯誤。Streaming connection
:選擇TCP session
要不要保持,如果勾上標識連接會一直存在,如果沒有勾上,那么第一次響應后該鏈接就會被關閉。
(4)同請求一起發送參數
- 可以填寫key-value形式的參數。(發送了好像不太好使,請求參數還是填寫在下面的
Request data
中吧) Request data
:填入同請求一起發送參數,與HTTP采樣器類似,結合被測接口說明文檔來進行配置。
(5)Web Socket Response:接口響應相關設置
Response pattern
:采樣器將等待含有該標識的消息並繼續通信(或者直到timeout,該連接關閉)Close connection pattern
:如果服務器返回的消息含有填寫的字符,就結束會話。Proxy Server (currently not supported by Jetty)
:編輯代理服務器信息代(當前不支持Jetty)
Server Name or IP
:服務器IP地址或域名。
Port Number
:端口號。
Username
:用戶名。
Password
:密碼。Message Backlog
:定義服務器返回消息保留的最大長度。
5、使用JMeter測試WebSocket接口示例
我們請求一個WebSocket
接口為例,進行演示。
訪問地址:echo.websocket.org
。
(1)測試計划內包含的元件
添加元件操作步驟:
- 創建測試計划。
- 創建線程組:
選中“測試計划”右鍵 —> 添加 —> 線程(用戶) —> 線程組
。 - 在線程組中,添加取樣器
WebSocket Sampler
組件:選中“線程組”右鍵 —> 添加 —> 取樣器 —> WebSocket Sampler
。 - 在線程組中,添加監聽器“察看結果樹”組件:
選中“線程組”右鍵 —> 添加 —> 監聽器 —> 察看結果樹
。
最終測試計划中的元件如下:
點擊運行按鈕,會提示你先保存該腳本,腳本保存完成后會直接自動運行該腳本。
(2)WebSocket Sampler組件內容
就和編輯HTTP請求一樣,編寫必要的請求信息和請求數據即可。
編輯WebSocket
接口內容,如下圖所示:
(3)運行查看結果
結果如下圖所示:
說明使用JMeter成功發送WebSocket
請求並且得到了響應。
參考: