本文描述瞭如何利用JMeter來測試TCP/IP Socket應用的性能。文章先對Socket做了一點簡單介紹,而後提供並解釋了兩個樣例Socket應用,最後介紹如何利用JMeter來對它們進行測試。javascript
基於TCP/IP協議的Socket(套接字)應用是構成如今互聯網的基礎,HTTP協議就是創建在端口80上的套接字應用。如今仍是有不少應用直接創建套接字,接受客戶端的請求並進行相應的業務處理,那麼隨着業務量的增長,如何對基於套接字的應用進行性能測試呢?本文將介紹如何利用開源的JMeter對基於TCP/IP協議的套接字應用進行性能測試。css
套接字應用通常至少須要一對套接字,其中一個運行於客戶端,稱爲ClientSocket ,另外一個運行於服務器端,稱爲ServerSocket 。java
服務器和客戶端套接字之間的鏈接過程分爲三個步驟:服務器監聽,客戶端請求,鏈接確認。git
服務器端通常經過多線程的方式來接受不一樣用戶發出的處理請求,所以同時能夠接受多個客戶端發出的處理請求。套接字應用中客戶端和服務器端之間溝通的數據格式根據應用的設計而定,能夠是可讀的文本格式,也能夠是二進制流的格式,對於這兩種不一樣的格式,JMeter有不一樣的處理方式。github
被測應用的源碼請參見這裏. 若是想運行該程序,請點擊該連接下載socket_echo-0.0.1-SNAPSHOT.jar,而且在命令行下執行:算法
java -cp socket_echo-0.0.1-SNAPSHOT.jar net.xmeter.echo.TextServer
(請確保您的機器上已經安裝了Java)。 該程序會在4700端口創建一個ServerSocket,等待來自客戶端的請求,客戶端若是發送了一個字符串,服務器端返回「Echo: 「 + 客戶端發送的字符串。以下圖所示,若是咱們使用telnet鏈接到服務器端的套接字應用,雙方就能夠直接進行通訊了。apache
服務器端:接收到請求並返回客戶端「Echo: hello」字符串。服務器
客戶端經過telnet鏈接到服務器端的4700端口,並輸入hello多線程
使用JMeter對套接字進行測試,有如下的選項能夠作控制:socket
針對咱們的樣例應用,咱們的配置以下所示,具體的含義在前面都已經有描述,在這裏再也不贅述。若是想增長壓力,只需調整ThreadGroup中的數目便可。
被測應用的源碼請參見BinaryServer.java。若是想運行該程序,請點擊該連接下載socket_echo-0.0.1-SNAPSHOT.jar,而且在命令行下執行:
java -cp socket_echo-0.0.1-SNAPSHOT.jar net.xmeter.echo.BinaryServer
該應用場景是服務器端的套接字應用在接受來自客戶端發送的物聯網數據的請求,並進行解析及處理(處理邏輯就是在控制檯上打印客戶端發送過來的值)。客戶端發送過來的值的格式以下:
byte[0]: 開始界定符,用於標識數據的開始,值爲126,十六進制值爲7E
byte[1]: 發送的數據條數,若是一次發送了溫度、光照強度和溼度3條數據,則該值爲3
byte[2]: 數據1的類型,1爲溫度,2爲光照強度,3爲溼度
byte[3]: 數據1的值
byte[4]: 數據2的類型,1爲溫度,2爲光照強度,3爲溼度
byte[5]: 數據2的值
…
byte[last]: 校驗和
服務器套接字應用在完成處理後,返回給客戶端以下格式的值:
byte[0]: 開始界定符,用於標識數據的開始,值爲126,十六進制值爲7E
byte[1]: 返回碼,0爲成功,1爲失敗
byte[3]: 校驗和
byte[4]: 回車符做爲結束符
JMeter測試腳本中與字符類型相同的在這裏就不作解釋了,下面描述一下二進制格式測試的不一樣點:
1)由於如今須要發送的是二進制的數據,因此在「TCPClient classname」 字段中輸入的是 org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl
2)End of line(eol),服務器端返回的是以回車符爲結束的,所以這裏輸入回車符的ascii碼值10,若是你的被測應用不是10結尾,請輸入別的值
3)Text to send:發送的數據7E0301010214031EC9,7E是開始界定符,03表示這次傳輸3條數據,第一條數據爲溫度,值是0x01;第二條數據類型是光照強度,值爲0x14;第三條數據爲溼度,值爲0x1E,C9爲校驗和
另外針對該Sampler,腳本里還加了一個斷言,驗證返回的數據是否正確,能夠看到對結果的驗證指望是7e00ff0a,其中7e是開始界定符,00是返回碼,ff是校驗和,0a是回車符。
運行成功的話,在服務器端套接字應用的控制檯上能看到下面的信息。
Find the start delimiter at 0. Received data 1 for sensor temperature. Received data 20 for sensor brightness. Received data 30 for sensor humidity. Correct data. Return with correct response code.
若是讀者測試的基於套接字的應用比較複雜,JMeter自己提供的Sampler不能處理,那麼可能須要本身擴展TCP Sampler(通常能夠經過繼承類org.apache.jmeter.protocol.tcp.sampler.TCPClient來實現)。JMeter提供了靈活的插件擴展機制,容許用戶實現一些比較個性化的需求。讀者能夠參見咱們寫的這篇文章來了解如何擴展JMeter插件。