使用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 ...