编程中Java应用常需要访问Tomcat,Weblogic等中间件,如果因为远程机器没有开机或是中间件服务未启动而导致服务不可用,则程序会抛出异常。如果事先对这些端口进行检测会更有利与我们诊断错误,下面就是一个诊断远程端口的类:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import com.alpha.model.TPClientModel;
import com.alpha.util.DlgUtil;
/**
* 这个类仅本类使用
* @author 何杨
* @date 2009-11-5
* @time 下午03:15:20
*/
class IpPort{
String ip;
int port;
}
/**
* 远程端口探测器,判断远程端口是否打开
*
* @author 何杨
* @date 2009-11-5
* @time 下午02:48:56
*/
public class RemotePortTestor{
public static Logger logger = Logger.getLogger(TPClientModel.class);
// 测试项目集合
private List<IpPort> testItems;
/**
* 构造函数
*
* @param fileName
* @param keys
*/
public RemotePortTestor(String fileName,List<String> keys){
Properties prop=new Properties();
try {
prop.load(new FileInputStream(fileName));
testItems=new ArrayList<IpPort>();
for(String key:keys){
String value=prop.getProperty(key);
testItems.add(getIpPortAddr(value));
}
} catch (FileNotFoundException e) {
logger.error(e);
e.printStackTrace();
} catch (IOException e) {
logger.error(e);
e.printStackTrace();
}
}
/**
* 检测远端端口,全部通过返回真
*
* @return
* 创建人:何杨
* 创建日期:2009-11-5
* 创建时间:下午03:32:34
*/
public boolean testRemotePorts(){
for(IpPort ipPort:testItems){
if(testRemotePort(ipPort.ip,ipPort.port)==false){
return false;
}
}
return true;
}
/**
* 从URL中得到IP地址和端口
*
* @param url
* @return
* 创建人:何杨
* 创建日期:2009-11-5
* 创建时间:下午03:32:55
*/
private IpPort getIpPortAddr(String url){
IpPort ipPort=new IpPort();
String ip=getMatchedString("(//)(.*)(:)",url);
ipPort.ip=ip;
String port=getMatchedString("(:)(\\d+)",url);
ipPort.port=Integer.parseInt(port);
return ipPort;
}
/**
* 检测端口是否能连接上
*
* @param ip
* @param port
* @return
* 创建人:何杨
* 创建日期:2009-11-5
* 创建时间:下午03:33:20
*/
public static boolean testRemotePort(String ip,int port){
try {
Socket s=new Socket(ip,port);
System.out.println(s.getLocalAddress()+"可以访问"+ip+"上的端口"+port+"的服务.");
s=null;
return true;
} catch (Exception e) {
System.out.println("无法取得"+ip+"上的端口"+port+"的服务.");
DlgUtil.popupErrorDialog("无法取得"+ip+"上的端口"+port+"的服务!\r\n,请确认服务可用后再执行本程序!");
e.printStackTrace();
logger.error(e);
return false;
}
}
/**
* 从target找到regex能代表的文字
*
* @param regex
* @param target
* @return
* 创建人:何杨
* 创建日期:2009-11-5
* 创建时间:下午03:33:41
*/
public static String getMatchedString(String regex,String target){
Pattern pattern=Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher=pattern.matcher(target);
while(matcher.find()){
return matcher.group(2);
}
return null;
}
/**
* 测试入口
*
* @param args
* 创建人:何杨
* 创建日期:2009-11-5
* 创建时间:下午03:34:06
*/
public static void main(String[] args){
List<String> ls=new ArrayList<String>();
ls.add("webservice.url");
ls.add("jmsbroker.url");
String properitesFile=TPClientModel.class.getResource("/remoteservice.properites").getFile().toString();
RemotePortTestor rt=new RemotePortTestor(properitesFile,ls);
System.out.println(rt.testRemotePorts());
}
}
remoteservice.properites的内容如下:
webservice.url=http://localhost:8080/SampleWebService/services/service
jmsbroker.url=tcp://192.168.0.110:61616
以上程序会自动从上述URL中找出IP地址和端口,然后用Socket连接过去看是否能联通,主要使用了正则表达式和Socket,比较简单,大家可自行阅读理解。