編程中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,比較簡單,大家可自行閱讀理解。