解决方法及实现细节
为了解决项目面临的测试难题,本文采用 java 的多线程机制来模拟这三个问题所涉及的 场景。由于在本项目中客户端发出的请求需要复杂的处理,所以本文采用实现 Runnable 接口的方法来实现多线程,这样发 送请求的类还可以继承其它的工具类来实现复杂的处理。
由于 IMS Connect 所支持的 socket 的数目 (MAXSOC) 可 以从 100 到 65535,而 TCPIPQ 队列的大小可以从 50 到 65535,本文在实现客户端多线程请求前,设置 IMS Connect 的 MAXSOC=100 并且设置 TCPIPQ=50。
在这个前提下,本文实现的线程类在演示时,如果创建 100 个线程的客户端连 接,就会达到 socket 连接的上限,使 IMS Connect 的 Health 为 0,意味着不能再监听多余的 socket 请求,如果继续 发送 50 个请求,这些请求会进入 TCPIPQ 的队列,使这个缓存队列也达到上限。再继续发送请求就会被拒绝,并得到拒绝 的提示信息。
如果使用最简单的实现方法,可以参考如下的代码清单 2。
清单 2. 多客户端并发连接的简单 实现
class Utility { // 工具类
public byte[] getHeadData(String...parms){
.....
....
}
public byte[] getBodyData(String...parms){
.....
....
}
public byte[] getFootData(String...parms){
.....
....
}
}
class SocketClient extends Utility implements Runnable,Test{ // 实现 Runnable 接口
String hostName;
int port;
public SocketClient(String hostName,int port) {
this.hostName=hostName;
this.port=port;
}
// 线程启动后的连接,并发送数据的
public void run() {
try {
INETAddress inetAddress = InetAddress.getByName(hostName);
Socket socket = new Socket(inetAddress,port);
OutputStream os = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
byte[] sendHeadData = getHeadData("aaa","bbb","ccc");
byte[] sendBodyData = getBodyData("ddd","eee","fff");
byte[] sendFootData = getFootData("ggg","hhh","iii");
bos.write(sendHeadData);
bos.write(sendBodyData);
bos.write(sendFootData);
bos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 测试的主线程,演示测试的一些场景
public class SocketConnectionDemo {
public int connectionNumb; // 连接数
public String hostName;// 连接的 IMS Connect 的域名
public int port;// 连接的端口
public SocketConnectionDemo(int connectionNumb,String hostName, int port){
this.connectionNumb=connectionNumb;
this.hostName=hostName;
this.port=port;
}
public static void main(String[] args) {
int connectionNumb = 50;
String hostName = "ec32181.vmec.svl.com";
int port = 9999;
SocketConnectionDemo scd = new SocketConnectionDemo(connectionNumb,hostName,port);
}
// 最简单的测试场景
public void testScenario1(){
for(int i=1; i<=connectionNumb; i++){
SocketClient sc = new SocketClient(hostName, port);
Thread clientT = new Thread(sc,"Client"+i);
clientT.start();
}
// 测试的具体逻辑
… ..
… .
}
}
¥29.00
¥498.00
¥299.00
¥399.00