我想从我的 c#/java 程序中获取域名的 whois 信息。有没有简单的方法可以做到这一点?
我在 dotnet-snippets.com 上找到了一个完美的 C# 示例(不再存在)。
只需 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();
}
我认为,最简单的方法是通过套接字连接到端口 43 上的 whois 服务器。发送域名后跟换行符并读取响应。
Thomas 的回答只有在您知道哪个“whois”服务器连接时才有效。
有很多不同的方法可以找出答案,但没有一种方法(AFAIK)对每个域注册机构都适用。
一些域名支持 DNS 中
SRV
服务的 _nicname._tcp
记录,但存在问题,因为目前还没有公认的标准来防止子域提供 SRV
记录覆盖那些官方注册表(参见 https://datatracker.ietf.org/doc/html/draft-sanz-whois-srv-00)。
对于许多 TLD,可以将您的查询发送至
<tld>.whois-servers.net
。这实际上工作得很好,但要注意它不会在所有有官方授权的二级域的情况下工作。
例如在
.uk
中有几个官方子域,但其中只有一些由 .uk
注册管理机构运行,其他的有自己的 WHOIS 服务,但这些不在 whois-servers.net
数据库中。
令人困惑的是,还有“非官方”注册表,例如
.uk.com
,在whois-servers.net
数据库中。
附注与大多数 IETF 协议一样,WHOIS 中的官方行尾分隔符是
CRLF
,而不仅仅是 LF
.
我找到了一些提供此信息的网络服务。这个是免费的,对我来说效果很好。 http://www.webservicex.net/whois.asmx?op=GetWhoIS
我在这里找到了一个完美的 C# 示例。将 11 行代码直接复制并粘贴到您自己的应用程序中。但首先你应该添加一些 using 语句以确保正确调用 dispose 方法以防止内存泄漏:
StringBuilder stringBuilderResult = new StringBuilder();
using(TcpClient tcpClinetWhois = new TcpClient(whoIsServer, 43))
{
using(NetworkStream networkStreamWhois = tcpClinetWhois.GetStream())
{
using(BufferedStream bufferedStreamWhois = new BufferedStream(networkStreamWhois))
{
using(StreamWriter streamWriter = new StreamWriter(bufferedStreamWhois))
{
streamWriter.WriteLine(url);
streamWriter.Flush();
using (StreamReader streamReaderReceive = new StreamReader(bufferedStreamWhois))
{
while (!streamReaderReceive.EndOfStream) stringBuilderResult.AppendLine(streamReaderReceive.ReadLine());
}
}
}
}
}
如果您将
leaveOpen: true
添加到 StreamWriter
和 StreamReader
构造函数。您不会得到“无法访问已关闭的流”异常
var stringBuilderResult = new StringBuilder();
using (var tcpClinetWhois = new TcpClient(whoIsServer, 43))
using (var networkStreamWhois = tcpClinetWhois.GetStream())
using (var bufferedStreamWhois = new BufferedStream(networkStreamWhois))
using (var streamWriter = new StreamWriter(networkStreamWhois, leaveOpen: true))
{
streamWriter.WriteLine(url);
streamWriter.Flush();
using (var streamReaderReceive = new StreamReader(networkStreamWhois, leaveOpen: true))
{
while (!streamReaderReceive.EndOfStream)
{
stringBuilderResult.AppendLine(streamReaderReceive.ReadLine());
}
}
}
这里是Java解决方案,它只是打开一个shell并运行
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 = outputSB.toString();
}
}