最近買了一臺機(jī)器做個source服務(wù)器和異地的幾個朋友一起做點(diǎn)東西玩玩。但是由于用的是電信的ADSL,所以地址是動態(tài)的,每天機(jī)器自動重起的時候就會變化。于是我就用3322的域名綁定,但是3322提供的windows更新dns的客戶端運(yùn)行時不是作為系統(tǒng)服務(wù)運(yùn)行的,所以沒有用戶登錄時它是沒有運(yùn)行的,所以還是沒有解決問題。后來下了一個Windows Resource Kit Tools(這個工具windows server默認(rèn)是沒有的,需要到微軟的網(wǎng)站上下載,具體地址我沒有記住,google一下肯定能找到),里面有一些工具可以把普通的win32程序變成系統(tǒng)服務(wù)。
 instsrv: 這個工具是把win32程序變成系統(tǒng)服務(wù),但是并不是所有程序都適合做系統(tǒng)服務(wù)的,如CN99的客戶端,注冊成系統(tǒng)服務(wù)后就是無法啟動的。
基本用法:instsrv [服務(wù)名] [應(yīng)用程序絕對路徑]
srvany: 這個工具就是用來解決上面的工具中的問題,你注冊的時候把它當(dāng)作你要的服務(wù),在用它來啟動你的應(yīng)用程序。
instsrv  [服務(wù)名] [srvany的絕對路徑]
注冊成功后,到服務(wù)管理器中把剛才注冊的服務(wù)打開,在啟動參數(shù)中填上你的應(yīng)用程序絕對路徑,啟動服務(wù)就可以了。
這種方式可以解決更新域名地址的問題了。

但是心里不爽,作為一個程序員如此受制于人總是不爽的,其實(shí)CN99的動態(tài)域名更新協(xié)議很簡單,編個簡單的程序就實(shí)現(xiàn)的。無奈只會Java,對于C或C++程序員來說,做一個系統(tǒng)服務(wù)實(shí)在是小Case啊,后悔當(dāng)初沒有好好學(xué)C和C++。但是難道就沒有辦法把Java程序變成windows系統(tǒng)服務(wù)嗎?在Java的世界里基本上是沒有不可能的事,ObjectWeb Forge上有個項(xiàng)目叫JavaService就是用來把Java程序注冊成系統(tǒng)服務(wù)的。于是下來看了一下:
一試--失敗
二試--不成功
三試--...
...
...
放棄!
老子自己做了,其實(shí)有了上面的instsrv和srvany其實(shí)就差一個可執(zhí)行文件了。于是我用JBuilder把我的jar包做成了一個假的exe文件。
我的DNS更新程序如下:

package org.mstar.dns;

import java.util.TimerTask;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.HttpException;
import java.io.IOException;
import java.util.*;
import org.apache.commons.logging.*;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import java.text.SimpleDateFormat;

public class Refresher {
    
private static Log LOG = LogFactory.getLog(Refresher.class);
    
public Refresher() {
        Timer timer 
= new Timer();
        timer.schedule(
new RefreshTask(), 060000);
    }

    
class RefreshTask extends TimerTask {
        
static final String URL =
                
"http://members.3322.org/dyndns/update?system=dyndns&hostname=zjumty.3322.org";

        
public void run() {
            HttpClient client 
= new HttpClient();
            client.getParams().setAuthenticationPreemptive(
true);
            Credentials defaultcreds 
= new UsernamePasswordCredentials(
                    
"username""password"); //此處我要保密
            client.getState().setCredentials(
new AuthScope("members.3322.org",
                    
80, AuthScope.ANY_REALM), defaultcreds);
            GetMethod method 
= new GetMethod(URL);
            
try {
                
int statusCode = client.executeMethod(method);
                
if (statusCode != HttpStatus.SC_OK) {
                    LOG.error(
"Method failed: " + method.getStatusLine());
                }
                Date date 
= Calendar.getInstance().getTime();
                SimpleDateFormat fmt 
= new SimpleDateFormat(
                        
"yyyy/MM/dd HH:mm:ss");
                
byte[] responseBody = method.getResponseBody();
                LOG.info(fmt.format(date) 
+ " -- " + new String(responseBody));
            } 
catch (HttpException e) {
                LOG.error(
"Fatal protocol violation: " + e.getMessage());
                e.printStackTrace();
            } 
catch (IOException e) {
                LOG.error(
"Fatal transport error: " + e.getMessage());
                e.printStackTrace();
            } 
finally {
                method.releaseConnection();
            }

        }
    }


    
public static void main(String[] args) {
        Refresher refresher 
= new Refresher();
    }
}


其實(shí)就是用Jakarta的HttpClient來請求一個URL就可以了。
于是我現(xiàn)在有了我的Refresher.exe。當(dāng)然你的系統(tǒng)上一定要有JVM才能運(yùn)行(廢話)。為了運(yùn)行方便我是把運(yùn)行時的jar包,如logger.jar,httpclient.jar等打在我的jar包里了。

現(xiàn)在就是把它搞成系統(tǒng)服務(wù)了。
第一步:instsrv Refrehser C:\Program Files\Windows Resource Kits\Tools\srvany.exe
第二步:regedit打開注冊表
第三步:進(jìn)入HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Refrehser
第四步:右鍵-新建-項(xiàng)  填入 Parameters
第五步:打開Parameters,右鍵-新建-字符串值 Application
第六步:雙擊Application 填入 c:\refresher.exe
弟七步:啟動Refresher服務(wù)。

一切都OK了。
在Parameters里還可以添加很多鍵值:
AppDirectory    工作目錄
AppParameters 你的應(yīng)用程序的參數(shù)。(我可以把我上面程序做成可以接受參數(shù)的,就更通用了)
AppEnvironment 運(yùn)行環(huán)境變量。

值現(xiàn)在作為Java程序員的你也可以為自己系統(tǒng)添加一些動能了,趕快去做吧!