Zyaire
才疏不耻志气狂
Beyond
域名自动解析程序

写了一个小程序,可以自动解析域名,用的是阿里云的域名,阿里云提供的api。

对于家里放了nas的人来说,固定的公网ip是一个大问题。一般的解决方式是DDNS或者内网穿透,以上方法我都试过,但是对于大流量传输不太友好,延迟和带宽都成问题。

于是就写了这个程序,很简单就三个类,也没有花费多少时间。能够完美运行,希望大佬们看到了能提出一点建议,我一定会采纳的!

  • Main.java
package src;

import java.util.Timer;

import top.shuzewu.tool.io.PrintStreamLog;

/ *
*
* 自动解析域名
*
* 可以定时判断当前服务器的公网ip并且解析到域名
*
* @author Zyaire
* @version 1.0, 2019-12-20
*
*/
public class Main{
	//设置查询IP的时间间隔;
	private static final long time = 3600000;
	//这里保存ip的变化情况到日志,根据系统而定
	public static final String path = "/home/perm/SetDNS/a.log";
	public static void main(String []args) {
		Timer timer = new Timer();
		timer.schedule(new MyTask(),3000,time);
		PrintStreamLog.logToFile(path, "程序开始");
	}
}
  • MyTask.java
package src;

import java.io.IOException;
import java.util.TimerTask;

import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;

import top.shuzewu.tool.io.PrintStreamLog;
import top.shuzewu.tool.net.BoolConnectedNet;
import top.shuzewu.tool.net.GetPublicIPAddr;

public class MyTask extends TimerTask{
    //设置dns的对象,直接用的阿里云的测试代码稍加修改而成
	private SetDNS s = new SetDNS();
	//域名当前解析的ip
	private String IP ;
	//当前公网ip
	private String pubIP ;
	public void run() {
		PrintStreamLog.logToFile(Main.path, "监听线程启动");
		startToSet();
		//每一个小时开启一个新的线程
		System.out.println("over");
	}
	public void startToSet() {
		if(!BoolConnectedNet.ifConnected()) {
			//如果没有互联网连接直接结束
			return;
		}		
		try {
			//获取保存的ip和当前公网ip
				getIP();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return;
		}catch (ClientException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return;
		}
        //这里是为了防止查询公网ip的接口失效,如果有任意一个为空就结束程序
        if(this.IP==null|| this.pubIP == null) return;
		if(this.IP.equals(this.pubIP)) {
			//代表公网ip和解析的ip相同
			PrintStreamLog.logToFile(Main.path, "IP相同,持续监听");
		}else {
			PrintStreamLog.logToFile(Main.path, "IP不相同");
			if(s.setDNS(this.pubIP)) {
				PrintStreamLog.logToFile(Main.path, "DNS解析修改成功");
			}else {
				PrintStreamLog.logToFile(Main.path, "DNS解析修改失败");
			}
		}
	}

 	private void getIP() throws IOException, ServerException, ClientException {
		    //获取当前的ip解析记录和公网ip
 	        this.IP = s.askRecord();
			this.pubIP = GetPublicIPAddr.getIP();
			String msg = "当前解析记录ip:"+this.IP+"\t公网IP:"+this.pubIP;
			PrintStreamLog.logToFile(Main.path, msg);
	}
}
  • SetDns.java
package src;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.alidns.model.v20150109.*;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
public class SetDNS{
	private static boolean  flag = true;
	//域名解析类型
	private String Type = "A";
	//记录名
	private String RR = "video";
	//对应的记录的id,可以用阿里云提供的调试工具获取
	private String RecordId = "1111111111111";
	//阿里云的id和秘钥
	private String accessKeyId = "***************";
	private String accessSecret =  "******************";
	private DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessSecret);
    private IAcsClient client = new DefaultAcsClient(profile);
    private  void setdns(String IPAddr) throws Exception{
        
        UpdateDomainRecordRequest request = new UpdateDomainRecordRequest();
        request.setValue(IPAddr);
        request.setType(Type);
        request.setRR(RR);
        request.setRecordId(RecordId);
        UpdateDomainRecordResponse response = (UpdateDomainRecordResponse) client.getAcsResponse(request);
        
        
    }
    public boolean setDNS(String IPAddr) {
    	//这里增加了一个判断,判断解析是否成功
    	try {
			setdns(IPAddr);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			//se.printStackTrace();
			flag = false;
		}
    	return flag;
    }
    public String askRecord() throws ServerException, ClientException {
    	//查询某条记录的值
    	DescribeDomainRecordInfoRequest recordInfo = new DescribeDomainRecordInfoRequest();
    	recordInfo.setRecordId("11111111111111");
    	DescribeDomainRecordInfoResponse respone = (DescribeDomainRecordInfoResponse) client.getAcsResponse(recordInfo);
    	return respone.getValue();
    }
}

用到了阿里云的api和我自己的一个工具包。

感谢你的阅读,欢迎留下宝贵的意见。

4月28日更新

优化了以上代码,以前把问题复杂化了,现在去掉了MyTask类。

  • Main.java
package src;
import java.util.Timer;

import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;

import top.shuzewu.tool.io.PrintStreamLog;
import top.shuzewu.tool.net.BoolConnectedNet;
import top.shuzewu.tool.net.GetPublicIPAddr;


/**
* 自动解析域名
*
* 可以定时判断当前服务器的公网ip并且解析到域名
*
* @author Zyaire
* @version 2.0, 2020-04-28
*/
public class Main{
	//设置查询IP的时间间隔;
	private static final long time = 600000;
	//这里保存ip的变化情况到日志,根据系统而定 
	private static final String path = "/home/perm/SetDNS/a.log";
	public static void main(String []args) {
		PrintStreamLog.logToFile(path, "程序开始");
		 SetDNS s = new SetDNS();
		 //先查询一次当前域名对应的解析记录
		 String pubIP = null;
		 String recordIP = null;
		 try {
			 recordIP =s.askRecord();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			PrintStreamLog.logToFile(Main.path, "阿里云api出现问题");
			e.printStackTrace();
		} 
		 while(true) {
				if(!BoolConnectedNet.ifConnected()) {
					//如果没有互联网连接直接结束
					System.out.println("无网络");
					return;
				}	
			 //当前的公网IP
			 pubIP = GetPublicIPAddr.getIP();
			 PrintStreamLog.logToFile(path, "解析记录:"+recordIP+"\t当前IP:"+pubIP);
		        //这里是为了防止查询公网ip的接口失效,如果有任意一个为空就结束程序
		        if(recordIP==null||pubIP == null) return;
				if(recordIP.equals(pubIP)) {
					//代表公网ip和解析的ip相同
					PrintStreamLog.logToFile(path, "IP相同,持续监听");
				}else {
					PrintStreamLog.logToFile(path, "IP不相同");
					if(s.setDNS(pubIP)) {
						PrintStreamLog.logToFile(path, "DNS解析修改成功");
						recordIP = pubIP;
					}else {
						PrintStreamLog.logToFile(path, "DNS解析修改失败");
					}
				}
			  try {
				Thread.sleep(time);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		 }
	
	}
}

发表评论

textsms
account_circle
email

5 × 5 =

Beyond

域名自动解析程序
写了一个小程序,可以自动解析域名,用的是阿里云的域名,阿里云提供的api。 对于家里放了nas的人来说,固定的公网ip是一个大问题。一般的解决方式是DDNS或者内网穿透,以上方法我都试…
扫描二维码继续阅读
2020-02-12