高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

nGrinder socket协议+DLL库调用脚本

目录
  1. 1. socket协议
  2. 2. 调用dll库

最近有个POS机刷卡消费的压测需求,走的是socket协议,并且开发将标准银联POS终端MAC加密算法封装到了DLL中,消费报文组装的时候需要调DLL库中的方法进行报文加密。

根据上面的描述,编写nGrinder脚本的时候需要实现:

  1. 模拟socket协议
  2. 调用dll库

socket协议

java模拟socket通信

脚本参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import net.grinder.script.GTest
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
import static org.junit.Assert.*
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

import static net.grinder.script.Grinder.grinder


@RunWith(GrinderRunner)
class SocketTest {

public BufferedReader bufferedReader;
public InputStream inputStream;
public PrintWriter printWriter;
public DataOutputStream outputStream;
public BufferedWriter bufferedWriter;
public String reqData;

GTest test1 = new GTest(1, "SocketTest")

@BeforeProcess
public static void beforeProcess() {
//进程初始化
grinder.logger.info("beforeProcess.")
}

@BeforeThread
public void beforeThread() {
test1.record(this, "action")
grinder.logger.info("beforeThread.")
}


@Test
public void action(){

Socket socket = new Socket("192.168.1.1", 9100);
socket.setSoLinger(false, 0);
try {
inputStream = socket.getInputStream();
outputStream = new DataOutputStream(socket.getOutputStream());
bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));

String reqData = "";
outputStream.write(reqData);
bufferedWriter.flush();

BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String mess = br.readLine();

System.out.println("mess==>" + mess);

if(!mess.isEmpty()){
System.out.println(">>>>>>>>>>>>>>>pass>>>>>");
assertTrue(true);
}else {
grinder.logger.error("===失败==========")
assertFalse(true);
}
} catch (Exception e) {
fail("exception"+e.printStackTrace())
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (Exception e) {
socket = null;
System.out.println("服务异常:" + e.getMessage());
}
}

}
}


}

调用dll库

这里使用jna调dll的方式,另外我们知道.dll是windows下的动态库,linux下的为.so文件。所以这里nGrinder的agent需要安装windows版本的。

32位的dll对应32位的jdk,64位的dll对应64位的jdk。安装agent的时候需要注意jdk的版本。

使用第三方jar包:jna-3.2.5.jar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public class DLLUtils {


public static String dllPath="E:\\xxx.dll";


public interface testdll extends Library {


testdll Instance = (testdll) Native.loadLibrary(dllPath, testdll.class);

//dll中的方法
void initKey(char[] a, char[] b, char[] c);

}

将以上dll调用打成jar包,放入nGrinder脚本中调用即可。