在工作中有个接口是tcp协议的,然后需要压测一下,就想到jmeter有现成的tcp取样器,搜了一下,压测流程大致和http差不多,需要注意的是tcp请求的一些设置,在此记录一下~
最开始的基础配置
1.根据需求改一下配置文件,根据需求看看自己要发的是哪一种请求,直接在配置文件里搜索一些tcp,设置成对应的参数,
参数的意思: TCP Sampler提供了3个报文编码类型的实现,分别是
org.apache.jmeter.protocol.tcp.sampler. TCPClientImp
org.apache.jmeter.protocol.tcp.sampler. BinaryTCPClientImpl
org.apache.jmeter.protocol.tcp.sampler. LengthPrefixedBinaryTCPClientImpl
1)TCPClientImpl以文本编辑器中所编辑的纯文本为内容进行发送。—这个是默认的,如果就是这个就不用改了
2)BinaryTCPClientImpl以文本编辑器中所编辑的16进制字符(hex)内容为基础转换为二进制的 字节内容进行发送。
3)LengthPrefixedBinaryTCPClientImpl在BinaryTCPClientImpl基础上默认以发送内容的长度为 字节前缀进行填充
需要注意的是,配置完需要重启一下 生效。
配置完开干
2.我按需求改成第3个参数,兴致勃勃的发起请求,结果链接失败,请教了开发,原来我们这个接口参数前面还加了一些参数,总之如果在tcp请求你去弄就是超级麻烦,所以我就换了个思路,用beanshell处理器先处理要请求的数据,再在tcp请求里直接引入就好了。。
处理的数据是把字符串转换成十六进制的,然后也是直接在放入数据时这一步参数化了(我看还有一种方法是直接把数据转换好放在csv里。。也可以嘛,都行)
String json ="xxxxx";
public static String toHexString(String str){
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
int ch = (int) str.charAt(i);
String strHex = Integer.toHexString(ch);
hexString.append(strHex);
}
return hexString.toString();
}
vars.put("data", toHexString(json));
在beanshell里面处理完拿到data数据,再在tcp取样器中直接用了,就直接用了它默认的报文编码类型,然后就看到客户端调用成功了。
调通以后踩到的坑
3.虽然调用成功,但是我发现多发几次明明客户端收到请求也正常返回了,但是取样器结果Response code:500 百度了一些说因为未配置 「结束符」 所致,只有当客户端在取响应流中读到 「结束符」 才会认为本次业务完成,否则会一直阻塞,直到流被关闭。 useEolByte这个字段 ,配置一下,比如我这个请求是十六进制,最后两位是0a,那么这个需要转换成十进制的,就是 10
给它填上,每次请求完,就直接结束,不会再阻塞了。 一个转换的工具网页https://tool.oschina.net/hexconvert/
一些思考
4.然后因为我就压这一个接口,所以正常压就可以了。但是如果是多个tcp接口压测可能就不是这么简单了,(因为它要握手握手握手不知道啥时候松手),百度了一下,大概是这样的:如果有很多tcp接口,且都是有规律的,可以在Re-use connection和关闭链接这里设置一下,: 其他的都勾选Re-use connection, 表示大家都可以共用一个socket,最后一个勾关闭链接,tcp执行完就关闭了
如果不知道参数长啥样
5.最开始我不确定我发的这个tcp协议的请求是长啥样的,也用了一下wireshark,平时都用的fiddler,很久很久没测过http协议以外的了,但是tcp还得用这个小鲨鱼才抓得到,打开数据实在太多了,可以用过滤器筛选想要的数据,直接筛选tcp协议的端口吧 tcp.port==XXX
找到直接要的那条数据,右键追踪流,然后点tcp流
弹出来一个框框,把下面的数据改成原始数据,然后就能拿到这个tcp协议本来的样子了, 复制出来,放在tcp工具里调用一下,能调通就说明拿对了,然后再在jmeter里调吧~
笔记大概就这么多吧。。如果后面还有再继续写上来
|