使用Java实现DNS域名解析的简单示例
普通的域名解析方法:
importjava.net.*; publicclassKkkk{ publicstaticvoidmain(Stringargs[])throwsException{ InetAddressaddress=InetAddress.getByName("wxh-PC");//wxh-PC是我的计算机名 System.out.println(address); System.out.println("-----"); InetAddressaddress1=InetAddress.getLocalHost(); System.out.println(address1); InetAddress[]addresses=InetAddress .getAllByName("www.baidu.com"); System.out.println(addresses.length); for(InetAddressaddr:addresses){ System.out.println(addr); } } }
实现具有动态主机IP的域名解析
目的利用一台INTERNETDNSHOST将域名定向到家中(个人)的主机上.
目前CABLEMODEM已经很快了,而且有动态IP,所以就有了将域名解析到个人机器的上可能.
只要通过很简单的设置就可以搞定.
例如你有一个域名叫yourdomain.com,你可以将此域名解析任意的主机.
1.服务器(IP:A.A.A.A)启动DNS动态解析的一个小进程.
jb51.net的域名文件为/var/named/jb51.net
再建个/var/named/jb51.net.static(模板文件可以用来生成jb51.net的)
(JDK1.3,linux)
#原代码如下:ThreadDNSReloadServer.java importjava.io.*; importjava.net.*; publicclassThreadDNSReloadServer {publicstaticvoidmain(String[]args) {inti=1; try {ServerSockets=newServerSocket(8189); for(;;) {Socketincoming=s.accept(); System.out.println("acceptnewclient:"+i); newThreadDNSReloadHandle(incoming,i).start(); i++; } } catch(Exceptione) {System.out.println(e); } } } classThreadDNSReloadHandleextendsThread {publicThreadDNSReloadHandle(Socketi,intc) {incoming=i;counter=c;} publicvoidrun() {try {BufferedReaderin=newBufferedReader(newInputStreamReader(incoming.getInputStream())); StringUser="Unkown"; StringDNSFILEPATH="/var/named/"; StringDNSFILE="jb51.net"; StringHOSTIP="127.0.0.1"; booleanUSER_VALIDATED=true; booleandone=false; while(!done) {Stringstr=in.readLine(); //validateuser; if(str==null)done=true; else { str=str.trim(); if(str.substring(0,2).equals("LA")) {if(str.length()>2)User=str.substring(2); } if(str.substring(0,2).equals("LB")) {if(str.length()>2)DNSFILE=str.substring(2); } if(str.substring(0,2).equals("LC")) {if(str.length()>2)HOSTIP=str.substring(2); } if(str.trim().equals("BYE"))done=true; } } incoming.close(); //加入用户验证. //将服务器中的jb51.net.static文件写入jb51.net中 StringDNSTMP=DNSFILEPATH+DNSFILE+".static"; BufferedReadersin=newBufferedReader(newFileReader(DNSTMP)); PrintWritersout=newPrintWriter(newFileWriter(DNSFILEPATH+DNSFILE),true); Strings; while((s=sin.readLine())!=null) { if(s.startsWith("host")) {s="hostINA"+HOSTIP; sout.println(s); s="@INA"+HOSTIP; } sout.println(s); } //System.out.println("User:"+User); //System.out.println("DNSFILE:"+DNSFILE); //System.out.println("HOSTIP:"+HOSTIP); //ndcreload Stringcommand="ndcreload"+DNSFILE; java.lang.Runtime.getRuntime().exec(command); } catch(Exceptione) {System.out.println(e); } } privateSocketincoming; privateintcounter; }
2.客户机(windows/linux)
#客户端每次启动时加入到开机启动(或进程中):SockTest.java importjava.io.*; importjava.net.*; publicclassSocketTest {publicstaticvoidmain(String[]args) {try {Sockets=newSocket("A.A.A.A",8189); BufferedReaderin=newBufferedReader(newInputStreamReader(s.getInputStream())); PrintWriterout=newPrintWriter(s.getOutputStream(),true); InetAddresslocalHostAddress=InetAddress.getLocalHost();//getLocalHostIp out.println("LAguest"); out.println("LByourdomain.com"); out.println("LC"+localHostAddress.getHostAddress()); out.close(); s.close(); } catch(IOExceptione) {System.out.println(e); } } }
dns样本文件:(jb51.net.static)
@ns.dnsserver.comxxxxx xxxx hostINA127.0.0.1//此处就是要更改的地方 wwwINCNAMEhost ...