ADSL動態IP需綁定3322域名,但其Windows客戶端非系統服務,無用戶登錄不運行。嘗試Windows Resource Kit Tools(instsrv+srvany)將普通程序註冊為服務,但CN99客戶端註冊後無法啟動。決定自行開發Java版動態DNS更新程序並註冊為系統服務。
instsrv ServiceName srvany.exe路徑 註冊服務package org.mstar.dns;
import java.util.TimerTask;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.logging.*;
public class Refresher {
private static Log LOG = LogFactory.getLog(Refresher.class);
public Refresher() {
Timer timer = new Timer();
timer.schedule(new RefreshTask(), 0, 60000); // 每60秒執行
}
class RefreshTask extends TimerTask {
static final String URL = "https://members.3322.org/dyndns/update?system=dyndns&hostname=zjumty.3322.org";
public void run() {
HttpClient client = new HttpClient();
GetMethod get = new GetMethod(URL);
// 若需認證
// client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user", "pass"));
try {
int status = client.executeMethod(get);
if (status == HttpStatus.SC_OK) {
String response = get.getResponseBodyAsString();
LOG.info("DNS更新響應: " + response);
} else {
LOG.warn("DNS更新失敗,狀態碼: " + status);
}
} catch (Exception e) {
LOG.error("DNS更新異常", e);
} finally {
get.releaseConnection();
}
}
}
public static void main(String[] args) {
new Refresher(); // 啟動定時任務,主線程保持存活
// 若作為服務運行,主線程不退出即可
}
}
java.util.Timer+TimerTask,每60秒發起HTTP GET請求instsrv/srvany方案通用於任何可執行文件,無需Java原生服務支持此法成功解決動態域名更新無人值守運行問題,為Java程序部署為Windows服務提供了通用可行路徑。