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