任务描述
需要做一个程序对某一服务器运行的web server进行测算看对提出的request做出相应的时间并且在多个request同时提出时的响应时间
计划
因为java sdk中包含有比较全面的class能够对http等多种协议的处理方法进行了封装用起来比较方便能够在比较短的时间内快速开发出这一测算工具
需要个功能
a 因为不是仅仅对一个web server或者一个form进行测算所以需要程序能够灵活处理完成各种工作我采用了配置文件的形式让程序从配置文件中读取数据并作相应动作
b需要采用多线程方式对同一个web server提交多次request
开发过程
(读者可以跟随这一过程自己动手写代码到全文结束就能有一个完整可用的程序了)
主要的工作都有TestThread来完成代码如下
classTestThreadimplementsRunnable{
Parameterparam;
TestThread(Parameterpar){
param=par;
}
publicvoidrun(){
longtime=newDate()getTime();
try{
URLtarget=paramurl;
HttpURLConnectionconn=(HttpURLConnection)targetopenConnection();
connsetRequestMethod(thod);
inti;
for(i=;i<paramlength;i++){
connsetRequestProperty(paramkey[i]paramvalue[i]);
}
nnect();
BufferedReaderin=newBufferedReader(
newInputStreamReader(conngetInputStream()));
StringinputLine;
while((inputLine=inreadLine())!=null);
}
catch(Exceptione){
}
longtime=newDate()getTime();
Systemoutprintln(timetime);
}
}
class TestThread implements Runnable 而不是用extends Thread 的好处是独立设计一个类这个类还可以extends其它的class 而不是单独的extends Thread 另外一个好处是可以把处理方法放在各个不同的方法中然后在void run()中调用程序结构比较清晰
程序工作如下
在初始化一个TestThread实例的时候接受一个Parameter参数(稍候介绍)并在线程启动时计算开始的时间向目标机器发送请求包接受目标机器的返回结果再次计算时间并得到两次时间之差这就是服务器的响应时间
具体程序可以自己看懂就不多说了
classParameter{
URLurl;
String[]key;
String[]value;
Stringmethod;
intlength=;
publicvoidaddPair(StringkStringv){
Arrayset(keylengthk);
Arrayset(valuelengthv);
length++;
}
}
是用来传递参数的一个类参数是主程序从文件中读出来并存入这个类的一个对象里然后通过初始化TestThread传递给它的对象
publicclassTestServer{
staticintloopTimes=;
publicParameterreadFromArgFile(Stringstr){
FileInputStreamfileInput;
BufferedReaderbr;
Parameterparam=newParameter();
try{
fileInput=newFileInputStream(newFile(str));
br=newBufferedReader(
newInputStreamReader(fileInput));
Stringline;
while((line=brreadLine())!=null){
if(linestartsWith(URL)==true&&lineindexOf(=)>=){
intf=lineindexOf(=);
Stringurlstring=linesubstring(f+);
urlstringtrim();
paramurl=newURL(urlstring);
}
elseif(linestartsWith(METHOD)==true&&lineindexOf(=)>=){
intf=lineindexOf(=);
Stringmethod=linesubstring(f+);
methodtrim();
thod=method;
}
elseif(lineindexOf(=)!=){
intf=lineindexOf(=);
Stringkey=linesubstring(f);
Stringvalue=linesubstring(f+);
paramaddPair(keytrim()valuetrim());
}
}
fileInputclose();
brclose();
}
catch(FileNotFoundExceptione){
Systemoutprintln(File+str+notfound);
}
catch(NullPointerExceptione){
}
catch(IOExceptione){
Systemoutprintln(e);
}
returnparam;
}
publicstaticvoidmain(String[]args){
inti;
intj;
Parameterparam;
TestServertester=newTestServer();
for(i=;i<ArraygetLength(args);i++){
param=testerreadFromArgFile(args[i]);
for(j=;j<loopTimes;j++){
Threadth=newThread(newTestThread(param));
thstart();
}
}
}
}
主程序main也比较简单从命令行参数中读取文件名并依次打开读取其中的配置参数创建Parameter对象并传递给TestThread对象然后启动TestThread线程需要注意的是其中的错误处理当发现某个文件读写错误的时候是跳过这个文件而读取下一个文件而不是简单的退出
就这么简单(当然适当的改写一下就可以做一个加贴机或者灌水机之类的东东那是你的爱好和我无关))
程序全文列在最后并附上了说明
/****************************************************************
Program:TestServerjava
Description:sendrequestsinmultiplethreadstoservertotest
itsresponsesdelayance
Author:ariesram
Date:Aug
Usage:javaTestServerfilefile
fileformat:
URL=[FullURLofform]
METHOD=GET|POST|
key=value
key=value
andsoon
****************************************************************/
importjavaio*;
importjavalangreflectArray;
import*;
importjavautil*;
publicclassTestServer{
staticintloopTimes=;
publicParameterreadFromArgFile(Stringstr){
FileInputStreamfileInput;
BufferedReaderbr;
Parameterparam=newParameter();
try{
fileInput=newFileInputStream(newFile(str));
br=newBufferedReader(
newInputStreamReader(fileInput));
Stringline;
while((line=brreadLine())!=null){
if(linestartsWith(URL)==true&&lineindexOf(=)>=){
intf=lineindexOf(=);
Stringurlstring=linesubstring(f+);
urlstringtrim();
paramurl=newURL(urlstring);
}
elseif(linestartsWith(METHOD)==true&&lineindexOf(=)>=){
intf=lineindexOf(=);
Stringmethod=linesubstring(f+);
methodtrim();
thod=method;
}
elseif(lineindexOf(=)!=){
intf=lineindexOf(=);
Stringkey=linesubstring(f);
Stringvalue=linesubstring(f+);
paramaddPair(keytrim()valuetrim());
}
}
fileInputclose();
brclose();
}
catch(FileNotFoundExceptione){
Systemoutprintln(File+str+notfound);
}
catch(NullPointerExceptione){
}
catch(IOExceptione){
Systemoutprintln(e);
}
returnparam;
}
publicstaticvoidmain(String[]args){
inti;
intj;
Parameterparam;
TestServertester=newTestServer();
for(i=;i<ArraygetLength(args);i++){
param=testerreadFromArgFile(args[i]);
for(j=;j<loopTimes;j++){
Threadth=newThread(newTestThread(param));
thstart();
}
}
}
}
classParameter{
URLurl;
String[]key;
String[]value;
Stringmethod;
intlength=;
publicvoidaddPair(StringkStringv){
Arrayset(keylengthk);
Arrayset(valuelengthv);
length++;
}
}
classTestThreadimplementsRunnable{
Parameterparam;
TestThread(Parameterpar){
param=par;
}
publicvoidrun(){
longtime=newDate()getTime();
try{
URLtarget=paramurl;
HttpURLConnectionconn=(HttpURLConnection)targetopenConnection();
connsetRequestMethod(thod);
inti;
for(i=;i<paramlength;i++){
connsetRequestProperty(paramkey[i]paramvalue[i]);
}
nnect();
BufferedReaderin=newBufferedReader(
newInputStreamReader(conngetInputStream()));
StringinputLine;
while((inputLine=inreadLine())!=null);
}
catch(Exceptione){
}
longtime=newDate()getTime();
Systemoutprintln(timetime);
}
}