前提:IP、端口号、入参、响应数据 开发都提供好。
一.步骤
1.新建线程组,并add -->Sampler-->TCP Sample
2.在TCP取样器中,设置TCP请求的参数,主要设置的参数为:
(1)TCPClient classname:org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl
TCPClient classname 该参数一般有三个值设置:
- org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl(以文本编辑器中的纯文本作为内容发送)
- org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl(以文本编辑器中所编辑的16进制字符(hex)内容为基础转换为二进制的字节内容进行发送)(常用)
- org.apache.jmeter.protocol.tcp.sampler.LengthPrefixedBinaryTCPClientImpl(在BinaryTCPClientImpl基础上默认以发送内容的长度以字节前缀进行填充)
(2)服务器IP和端口号:输入自定义的-开发提供,如下图
(3)Text to send:待发送的数据报文 -开发提供,如下图中要发送的文本(16进制)
3.下载第三方的TCP插件包ApacheJMeter_tcp.jar,并放置在jmeterapache-jmeter-4.0libext目录下
4.修改jmeter.properties 配置文件(路径apache-jmeter-4.0in下)
搜索tcp 搜索到#tcp.handler=TCPClientImpl 是被注释掉的 在下面新增一行,如下:
tcp.handler=BinaryTCPClientImpl 保存文件,并重启Jmeter
5.最最重要的一点 End of line(EOL) byte value 值的设置
因为响应数据是以05结尾的(16进制), 需要将其转换为10进制,所以此处的值应该设置为5
以下重要概念来源请看这里 https://www.cnblogs.com/bf-blackfish/p/10579867.html (写的很详细,解决了我的问题!!!)
6.单线程接口运行成功
二.遇到的坑:
1.text to send 输入的16进制 不能换行 换行会报错Response message: java.lang.IllegalArgumentException: Hex-encoded binary string contains an uneven no. of digits
解决办法:删除掉多余的空行
2.End of line(EOL) byte value 该值不设置或者设置的不对 报500 jmeter.protocol.tcp.sampler.TCPSampler: org.apache.jmeter.protocol.tcp.sampler.ReadException:而且服务器一直没给返回,
解决办法:文本结束符,非常重要 End of line(EOL) byte value:响应数据的最后2位,转换为10进制的值。取值区间[-128,127]
3.要想每一个tcp请求结束后关闭掉链接,不然服务器上会显示多个链接,一直没释放
解决办法:勾选close connection:一个取样器就只会用一个tcp连接,也就是发送完报文以后,就关闭tcp连接。
4.建议设置超时时间和长连接(没用到 可以关注下)
Timeouts:设置请求和响应的超时时间,超时的话会报500错误。它决定了在你没有输入End of line 的时候,什么时候断开tcp连接。如果没有填写的话就会一直在这里,
Re-use connection:在一个线程里,复用一个连接,在要求TCP长连接的时候需要用到这个。
5.Test Action(试了下 没仔细研究)
在jmeter使用过程中,接口之间相关关联,而有些接口响应时间较长,导致下个接口执行时,可能未能获取到需要的信息。这个时候需要对上个接口做延时处理,就用到Test Action。
6.响应断言
勾选Main sample only 、响应文本 要测试的模式中,输入 响应数据