如何在JMeter的TCP Sampler中添加STX和ETX字符作为首尾标识
解决Socket消息中STX/ETX控制字符发送问题
问题原因
你直接用字符串"\x02"和"\x03"时,这些内容会被当作普通文本字符(即\、x、0、2)发送,而非对应的ASCII控制字符(STX对应ASCII码2,ETX对应ASCII码3)。Java/JMeter不会自动解析这种C风格转义序列,导致服务器收到的是转义文本而非目标控制字符。
解决方案
方案1:JSR223 Sampler中直接构造控制字符(推荐)
在JSR223 Sampler(用Groovy或Java语言)里,通过ASCII码直接生成STX和ETX字符,再拼接成完整消息:
// 生成STX(ASCII 2)和ETX(ASCII 3)控制字符 char stx = (char) 2; char etx = (char) 3; // 拼接消息,保留原有换行格式 String message = stx + "PLPL|WM|SL|AS|PICK|100002001|PICKORDER|I|GPick059|2025-04-30 22:05:09.00||E|N|Y||MX1|" + System.lineSeparator() + "GPick059|T123456001|1|JProd02|1" + System.lineSeparator() + etx; // 用BinaryTCPClientImpl发送二进制消息 def tcpClient = new org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl(); tcpClient.setup("你的服务器IP", 你的端口号); tcpClient.write(message.getBytes("UTF-8")); // 编码需和服务器保持一致 // 读取响应(按需使用) def response = tcpClient.read(); log.info("服务器响应:" + response); // 关闭连接 tcpClient.close();
方案2:使用JMeter TCP Sampler配置
如果用JMeter自带的TCP Sampler,按以下步骤设置:
- 选择
BinaryTCPClientImpl作为TCPClient类(它支持解析Unicode转义字符) - 在「Message」字段中,用Unicode转义序列
\u0002表示STX,\u0003表示ETX,消息内容如下:
\u0002PLPL|WM|SL|AS|PICK|100002001|PICKORDER|I|GPick059|2025-04-30 22:05:09.00||E|N|Y||MX1| GPick059|T123456001|1|JProd02|1\u0003
注意事项
- 确保字符编码和服务器端一致(常用UTF-8或ASCII),避免出现乱码
TCPClientImpl是文本模式,不支持解析转义字符,建议优先用BinaryTCPClientImpl发送含控制字符的消息
内容的提问来源于stack exchange,提问作者g90uagk
相关产品推荐
相关产品推荐

