當柳上原的風吹向天際的時候...

          真正的快樂來源于創造

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
          編程中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,比較簡單,大家可自行閱讀理解。


          posted on 2009-11-05 16:29 何楊 閱讀(494) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 陇川县| 珲春市| 喀什市| 南投市| 西乌| 佛山市| 新源县| 大埔县| 喀什市| 景德镇市| 长子县| 丹棱县| 金湖县| 凤阳县| 丰城市| 普宁市| 崇州市| 姚安县| 手游| 化隆| 时尚| 安西县| 日喀则市| 尼木县| 南安市| 苗栗县| 财经| 托克逊县| 尖扎县| 栾川县| 桐庐县| 视频| 兴国县| 桐梓县| 平原县| 镇远县| 临漳县| 东源县| 铜川市| 甘谷县| 诸暨市|