如何在我的程序中获取域名的Whois信息?
我想从我的c#/ java程序中获取域名的whois信息。有没有简单的方法可以做到这一点?
解决方案
回答
我认为,最简单的方法是在端口43上通过套接字连接到Whois服务器。发送域名,后跟换行符,然后读取响应。
回答
这是Java解决方案,它仅打开一个外壳并运行whois
:
import java.io.*; import java.util.*; public class ExecTest2 { public static void main(String[] args) throws IOException { Process result = Runtime.getRuntime().exec("whois stackoverflow.com"); BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream())); StringBuffer outputSB = new StringBuffer(40000); String s = null; while ((s = output.readLine()) != null) { outputSB.append(s + "\n"); System.out.println(s); } String whoisStr = output.toString(); } }
回答
仅当我们知道要连接到哪个" whois"服务器时,Thomas的答案才有效。
有很多不同的方法可以找到答案,但是没有一种方法(AFAIK)可以对每个域注册表统一使用。
某些域名在DNS中为_nicname._tcp
服务支持SRV
记录,但是存在一些问题,因为尚无关于如何防止子域提供覆盖它们的SRV
记录的公认标准。官方注册表(请参阅http://tools.ietf.org/html/draft-sanz-whois-srv-00)。
对于许多TLD,可以将查询发送到<tld> .whois-servers.net
。这实际上可以很好地工作,但是请注意,在有正式委派的二级域的情况下,它不能正常工作。
例如,在.uk中,有几个正式的子域,但是只有一部分是由.uk注册表运行的,而其他子域则拥有自己的WHOIS服务,而不在whois-servers.net中。 `数据库。
令人困惑的是,在" whois-servers.net"数据库中还存在"非官方"注册表,例如" .uk.com"。
p.s.与大多数IETF协议一样,WHOIS中的官方行尾定界符是CRLF,而不仅仅是LF。
回答
我发现了一些提供此信息的Web服务。这是免费的,对我来说很棒。 http://www.webservicex.net/whois.asmx?op=GetWhoIS
回答
我在dotnet-snippets.com(已经不存在)上找到了一个完美的Cexample。
这是11行代码,可以直接复制并粘贴到我们自己的应用程序中。
/// <summary> /// Gets the whois information. /// </summary> /// <param name="whoisServer">The whois server.</param> /// <param name="url">The URL.</param> /// <returns></returns> private string GetWhoisInformation(string whoisServer, string url) { StringBuilder stringBuilderResult = new StringBuilder(); TcpClient tcpClinetWhois = new TcpClient(whoisServer, 43); NetworkStream networkStreamWhois = tcpClinetWhois.GetStream(); BufferedStream bufferedStreamWhois = new BufferedStream(networkStreamWhois); StreamWriter streamWriter = new StreamWriter(bufferedStreamWhois); streamWriter.WriteLine(url); streamWriter.Flush(); StreamReader streamReaderReceive = new StreamReader(bufferedStreamWhois); while (!streamReaderReceive.EndOfStream) stringBuilderResult.AppendLine(streamReaderReceive.ReadLine()); return stringBuilderResult.ToString(); }