因為我之前對
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請求並且得到了響應。
參考:
