首页 > 其他分享 >浅谈配置元件之TCP取样器配置/TCP取样器

浅谈配置元件之TCP取样器配置/TCP取样器

时间:2024-06-18 16:57:17浏览次数:22  
标签:java 浅谈 TCP 取样器 客户端 连接 out

浅谈配置元件之TCP取样器配置/TCP取样器

1.引言

在进行网络性能测试时,TCP取样器配置和TCP 取样器(TCP Sampler)是两个重要的组件,他们允许用户直接发送和接收TCP 数据包,这对于测试服务器的TCP 连接处理能力、模拟特定的TCP 交互场景非常有用。本文档将详细介绍如何在JMeter中配置和使用TCP 取样器配置和TCP取样器使用,因为两者基本一样,所以两个放在一起讲解。

2.添加TCP 取样器配置/TCP 取样器

添加TCP取样器配置

  1. 新建线程组:首先,在测试计划中右击,选择“添加” > “Threads(Users)” > “线程组(Thread Group)”,添加一个线程组
  2. 添加TCP 取样器配置:在刚刚创建的线程组内,右击选择“添加” > “配置元件” > “TCP 取样器配置(TCP Sampler Config)”。
    添加TCP取样器
  3. 新建线程组:首先,在测试计划中右击,选择“添加” > “Threads(Users)” > “线程组(Thread Group)”,添加一个线程组
  4. 添加TCP 取样器:在刚刚创建的线程组内,右击选择“添加” > “取样器(Sampler)” > “TCP 取样器(TCP Sampler)”。

3.配置TCP 取样器

TCP 取样器的配置界面提供了多个参数,以满足不同的测试需求:
● TCPCllient classname:
TCP Sampler提供了3个报文编码类型的实现,分别是
1.org.apache.jmeter.protocol.tcp.sampler. TCPClientImp
2.org.apache.jmeter.protocol.tcp.sampler. BinaryTCPClientImpl
3.org.apache.jmeter.protocol.tcp.sampler. LengthPrefixedBinaryTCPClientImpl
1)TCPClientImpl以文本编辑器中所编辑的纯文本为内容进行发送。
2)BinaryTCPClientImpl以文本编辑器中所编辑的16进制字符(hex)内容为基础转换为二进制的
字节内容进行发送。
3)LengthPrefixedBinaryTCPClientImpl在BinaryTCPClientImpl基础上默认以发送内容的长度为
字节前缀进行填充。
案例说明的时候会根据不同的情况进行举例说明。
● 服务器名称或IP:输入目标服务器的域名或IP地址。
● 端口号:指定服务器上监听的TCP端口。
● 超时连接:与服务器套接字应用连接超时时间(毫秒)
● 超时时间:响应超时时间(毫秒),这个值的设置跟End of line(EOL) byte value有关系,如果End of line(EOL) byte value中的值设置不正确,会导致JMeter一直在等待无法结束,但是如果指定了Response Timeout这个值的话,在到达这个值的时候就关闭连接
● 重用连接(Re-use connection):勾选后,将在同一个线程内重用TCP连接,对于需要多次交互的测试场景非常有用。
● 关闭连接:测试结束后是否关闭连接。
● 设置无延迟:是否需要使用该选项,需要跟实际的业务情况结合
● SO_LINGER:该配置项用于控制在关闭连接之前是否要等待缓冲区中的数据发送完成。如果SO_LINGER选项指定了值,则在得到关闭连接的请求之后还会等待指定的秒数以完成缓冲区中数据的发送,在指定的SO_LINGER秒数完成后,关闭连接。因此,如果你把该选项设置成0,那么所有连接在收到关闭连接的时候都会立即关闭,避免产生很多处于TIME_WAIT状态的套接字。
● End of line(EOL) byte value:响应数据的最后2位,转换为10进制的值。取值区间[-128,127]。
● 要发送的文本:在此处输入要发送到服务器的数据。根据协议和需求,这可以是任何文本或二进制数据。

4.案例说明

情况1:TCPClientImp模式

  1. 后端测试代码如下
package com.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class tcp {
    public static void main(String[] args) throws Exception {
        // 监听的端口号
        int portNumber = 9002;
        // 创建 ServerSocket 对象
        ServerSocket serverSocket = new ServerSocket(portNumber);
        System.out.println("等待客户端连接...");

        while (true) {
            // 接受客户端的连接请求
            Socket client = serverSocket.accept();
            System.out.println("客户端已连接,IP地址:" + client.getInetAddress().getHostAddress());
            // 创建用于读取客户端发送的数据的输入流
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            System.out.println(in.readLine());
            // 创建用于向客户端发送数据的输出流
            PrintWriter out = new PrintWriter(client.getOutputStream(), true);
            out.println("hello Client");
            out.flush(); // 刷新缓冲区,保证数据已被发送
            // 关闭连接
            in.close();
            out.close();
            client.close();

        }
    }
}

TCPCllient classname选择TCPClientImp,jmeter.properties中设置为tcp.handler=TCPClientImpl,服务器名称或IP设置127.0.0.1,端口号设置9002,要发送的文本设置为{“a”: “b”,“c”: “d”},其他默认
运行脚本,查看结果树,在响应数据的Response Body中可以看到信息:hello Client

情况2:BinaryTCPClientImpl模式

  1. 后端测试代码如下
package com.test;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class tcp {
    public static void main(String[] args) throws Exception {
        // 监听的端口号
        int portNumber = 9002;
        // 创建 ServerSocket 对象
        ServerSocket serverSocket = new ServerSocket(portNumber);
        System.out.println("等待客户端连接...");
        while (true) {
            // 接受客户端的连接请求
            Socket client = serverSocket.accept();
            System.out.println("客户端已连接,IP地址:" + client.getInetAddress().getHostAddress());
            // 创建用于读取客户端发送的数据的输入流
            InputStream inputStream = client.getInputStream();
            // 读取数据
            byte[] buffer = new byte[1024];
            int bytesRead;
            StringBuilder data = new StringBuilder();
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                // 将读取到的数据转换为字符串并添加到data中
                data.append(new String(buffer, 0, bytesRead));
                break;
            }
            System.out.println("接收到的数据:\n" + data.toString());
            PrintWriter out = new PrintWriter(client.getOutputStream(), true);
            out.println("OK");
            out.flush(); // 刷新缓冲区,保证数据已被发送
            // 关闭连接
            out.close();
            client.close();

        }
    }
}

TCPCllient classname选择BinaryTCPClientImpl,jmeter.properties中设置为tcp.handler=BinaryTCPClientImpl,服务器名称或IP设置127.0.0.1,端口号设置9002,要发送的文本设置为697427732074696d6520746f20706c61792e,使用在线工具(https://www.sojson.com/hexconvert/16to10.html)可以获取范围该内容为:it’s time to play.行尾(EOL)字节值使用10,其他默认运行脚本,查看结果树,在响应数据的Response Body中可以看到信息:4f4b0d0a,该数据进行翻译以后即为测试代码中OK的字符。

情况3:LengthPrefixedBinaryTCPClientImpl模式

根据情况2,发现发送内容无区别,但是在响应数据中可以看到不一样。

情况4:Re-use connection模式

后端测试代码如下

package com.test;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class tcp {
    public static void main(String[] args) throws Exception {
        // 监听的端口号
        int portNumber = 9002;
        // 创建 ServerSocket 对象
        ServerSocket serverSocket = new ServerSocket(portNumber);
        System.out.println("等待客户端连接...");

        while (true) {
            // 接受客户端的连接请求
            Socket client = serverSocket.accept();
            System.out.println("客户端已连接,IP地址:" + client.getInetAddress().getHostAddress());
            int remotePort = client.getPort();
            // 创建用于读取客户端发送的数据的输入流
            System.out.println("remotePort:" + remotePort);
            InputStream inputStream = client.getInputStream();
            // 读取数据
            byte[] buffer = new byte[1024];
            int bytesRead;
            StringBuilder data = new StringBuilder();
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                // 将读取到的数据转换为字符串并添加到data中
                data.append(new String(buffer, 0, bytesRead));
                break;
            }
            System.out.println("接收到的数据:\n" + data.toString());
            PrintWriter out = new PrintWriter(client.getOutputStream(), true);
            out.println("OK");
            out.flush(); // 刷新缓冲区,保证数据已被发送
            // 关闭连接
            out.close();
            client.close();

        }
    }
}

主要就是将关闭连接的代码取消,并且将线程组中的循环次数设置为2

未勾选Re-use connection,未勾选关闭连接
  1. 当我们未勾选的时候,进行TCP测试,可以看到java后台打印的信息如下
等待客户端连接...
客户端已连接,IP地址:10.33.123.18
remotePort:1066
接收到的数据:
it's time to play.
客户端已连接,IP地址:10.33.123.18
remotePort:1067
接收到的数据:
it's time to play.
勾选Re-use connection,未勾选关闭连接
  1. 当我们未勾选的时候,进行TCP测试,可以看到java后台打印的信息如下
客户端已连接,IP地址:10.33.123.18
remotePort:27770
接收到的数据:
it's time to play.
勾选Re-use connection,勾选关闭连接
  1. 当我们勾选的时候,在未测试TCP时,我们首先看下当前在只启动后台的情况下,TCP的监听情况
客户端已连接,IP地址:10.33.123.18
remotePort:13723
接收到的数据:
it's time to play.
客户端已连接,IP地址:10.33.123.18
remotePort:13724
接收到的数据:
it's time to play.
情况5:超时(毫秒):连接

超时(毫秒)中将连接设置为1,即1毫秒内需要建立连接,否则超时,其他参数不变,进行TCP测试,可以在查看结果树中看到如下结果:

Error Count: 1
Data type ("text"|"bin"|""): 
Response code: 500
Response message: java.net.SocketTimeoutException
情况6:超时(毫秒):响应

超时(毫秒)中将响应设置为1,即1毫秒内需要建立连接,否则超时,其他参数不变,进行TCP测试,可以在查看JMeter日志中看到如下结果:

Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method) ~[?:1.8.0_101]
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[?:1.8.0_101]
    at java.net.SocketInputStream.read(SocketInputStream.java:170) ~[?:1.8.0_101]
    at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[?:1.8.0_101]
    at java.net.SocketInputStream.read(SocketInputStream.java:127) ~[?:1.8.0_101]
    at org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl.read(BinaryTCPClientImpl.java:134) ~[ApacheJMeter_tcp.jar:5.1.1 r1855137]
    ... 6 more

5.总结

通过上述步骤,你可以有效地配置和利用JMeter的TCP 取样器来进行TCP层面的性能和功能测试。无论是简单的连接测试,还是复杂的交互协议模拟,TCP 取样器都提供了强大的支持。记得在实际测试前,充分理解你的测试目标,并根据需要调整取样器的配置选项,以确保测试的有效性和准确性。

标签:java,浅谈,TCP,取样器,客户端,连接,out
From: https://blog.csdn.net/u012151594/article/details/139745412

相关文章

  • tcp/ip 每层的协议
    TCP/IP网络通常是由上到下分成4层,分别是应用层,传输层,网络层和网络接口层。 网络接口层的传输单位是帧(frame),IP层的传输单位是包(packet),TCP层的传输单位是段(segment),HTTP的传输单位则是消息或报文(message) 一般说来,数据链路层发出的数据包称为frame,地址是链路层的地址,如mac地......
  • tcp 连接
    前言看到这个标题你可能会说,TCP连接的建立与断开,这个我熟,不就是三次握手与四次挥手嘛。且慢,脑海中可以先尝试回答这几个问题:四次挥手是谁发起的?如果断电/断网了连接会断开吗?什么情况下没有四次挥手连接也会断开?这不是面试,而是遇到了实际问题,至于是什么问题,容我先卖个关子,......
  • 八路DI八路DO开关量输入输出 远程IO模块 Modbus TCP数据采集模块 YL90
    特点:●八路开关量输入,八路开关量输出● DI状态变化自动发送状态数据,可以捕获脉冲● 采用Socket自由协议编程简单、轻松应用● 开关量毫秒级响应速度适应多种场合● 内置网页功能,可以通过网页查询与控制● 同时也支持ModbusTCP通讯协议● 宽电源供电范围:8~32......
  • TCP_CONNECTION_ESTAB_02:验证DUT打开多个被动套接字并将它们连接到远程套接字
    测试目的:本测试用例的目的是验证DUT(被测试设备)是否能够同时打开多个TCP被动套接字,并能够对通过这些套接字接收到的TCP连接请求进行响应。当DUT接收到多个带有SYN标志位设置为1的TCP段时,DUT应该能够为每个请求打开一个TCP被动套接字,并向每个请求源发送一个同时包含SYN和ACK......
  • go tcp 同步 请求
      客户端服务端典型的同步请求-响应模型简单的Go示例,展示了如何实现您描述的同步请求-响应模型。客户端会发送一个包,然后等待接收服务器的响应。服务器接收包后处理数据,然后发送处理完成的消息。客户端接收到响应后,再次发送下一个包 服务端:packagemainimport(......
  • modbus TCP 操作寄存器,控制气密性测试仪
    #include"modbus.h"#include<iostream>#pragmacomment(lib,"modbus.lib")usingnamespacestd;intmain(){  modbus_t*ctx;  constchar*ipAddress="192.168.1.2";//ModbusTCP从机的IP地址  constintport=8000;//......
  • 浅谈红队攻防之道-将exe文件指定ico图标上线
    我们为什么跌倒?这样我们才能学会自己站起来。生成Payload这里使用Pakages生成一个Payload。在菜单栏中依次选择命令,如图保持默认配置,选择监听器,勾选x64,点击generate,生成1.exe文件(这个可以用生成的python的payload编译成exe,可以免杀)然后选择1.exe文件和刚刚生成的1.ico......
  • python IP 端口 socket tcp 介绍
    IP端口介绍1、IPIP地址是分配给网络设备上网使用的数字标签,它能够标识网络中唯一的一台设备windows环境可以使用ipconfig来查看自己的iplinux环境可以使用ifconfig来查看自己的ip2、端口端口是传输数据的通道,每个操作系统上都有65535个端口,通过对应的端口号把数......
  • 【杂记-浅谈交换机的二层转发和三层转发】
    一、二层转发二层转发,又称数据链路层转发,主要依赖MAC地址进行数据帧的转发。当数据帧的目的MAC地址是本地网络中的一个已知的MAC地址时,交换机会根据MAC地址表将数据帧转发到正确的端口。如果目的MAC地址不在MAC地址表中,交换机会向除了接收端口之外的所有端口进行广播。二层......
  • 浅谈网络通信(3)
    文章目录一、TCP[!]1.1、TCP协议报文格式1.2、TCP十大机制1.2.1、确认应答机制1.2.2、超时重传机制1.2.3、连接管理机制1.2.3.1、三次握手[其流程至关重要,面试必考]1.2.3.2.1、那为啥要建立连接??建立连接的意义是啥??1.2.3.2、四次挥手1.2.4、滑动窗口机制1.2.5、流量控制......