Task 需要被實作的類別
package yku; public interface Task { public boolean toDo(); //public boolean doNext(); }
NetTest 測試網路狀態
package yku; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.*; import java.text.ParseException; import java.util.StringTokenizer; public class NetTest implements Task { org.apache.log4j.Logger logger = org.apache.log4j.LogManager.getLogger(this .getClass()); // toDo是被TaskRunner呼叫的function,必需實作 @Override public boolean toDo() { logger.info("Do Test!"); try { // 取得getGateWay的ip String gateway = windowsParseGateWay(windowsRunIpConfigCommand()); logger.info("Default GateWay:" + gateway); if (gateway.length() == 0) { // 沒有ip時,利用Runtime.getRuntime.exec(要執行的cmd)來指行dos指令; Runtime.getRuntime().exec("c:/autoConnection2.cmd"); logger.info("run autoCommend2.cmd"); } } catch (ParseException e) { try { Runtime.getRuntime().exec("c:/autoConnection2.cmd"); } catch (IOException ex) { logger.info(ex); } logger.info("run autoCommend2.cmd"); e.printStackTrace(); logger.info(e); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); logger.info(e); } return true; } // 執行ipconfig /all 來取得windows的網路資料 private final static String windowsRunIpConfigCommand() throws IOException { Process p = Runtime.getRuntime().exec("ipconfig /all"); InputStream stdoutStream = new BufferedInputStream(p.getInputStream()); StringBuffer buffer = new StringBuffer(); for (;;) { int c = stdoutStream.read(); if (c == -1) break; buffer.append((char) c); } String outputText = buffer.toString(); stdoutStream.close(); return outputText; } private final static String windowsParseGateWay(String ipConfigResponse) throws ParseException { String localHost = null; try { // 先測試是否能取得ip,如果無ip,代表gateway也是沒有的 localHost = InetAddress.getLocalHost().getHostAddress(); } catch (java.net.UnknownHostException ex) { ex.printStackTrace(); throw new ParseException(ex.getMessage(), 0); } // 把每一行當成一個要判斷的內容 StringTokenizer tokenizer = new StringTokenizer(ipConfigResponse, "\n"); String lastMacAddress = null; boolean flg = false; while (tokenizer.hasMoreTokens()) { String line = tokenizer.nextToken().trim(); // flg是底下用來判斷是在那一張網卡下的gateway, // 因為是利用撥接的ADSL,所以設定檔可能有二個以上 if (flg) { // 取得Default Gateway的ip if (line.indexOf("Default Gateway") >= 0) { int GatePosition = line.indexOf(":"); if (GatePosition >= 0) { return line.substring(GatePosition + 1).trim(); } } } // 判斷是否在ADSL的撥接設定裡,其實只需要判斷存在此項目就可以了 if (line.indexOf("WAN (PPP/SLIP) Interface") >= 0) { flg = true; } } ParseException ex = new ParseException( "cannot read Default Gateway from [" + ipConfigResponse + "]", 0); ex.printStackTrace(); throw ex; } }
利用Windows排程在開機後讓ADSL自動撥號指令
存檔成autoConnection.cmd,其中rasphone.exe -d hinet是撥號adsl設定名稱為hinet,net start named 是啟動ics bind dns,java -jar xxx.jar是執行我打包好的jar檔
C:\WINDOWS\system32\rasphone.exe -d "hinet" net start named java -jar D:\tool\AutoCon\AutoCon.jar
當檢查斷線時執行的command
存檔成autoConnection2.cmd,其它設定跟前一個指令很像
@echo off C:\WINDOWS\system32\rasphone.exe -d "hinet" net stop named net start named
Pages: 1 2