java 如何在我的程序中获取域名的whois信息?

5jdjgkvh  于 2023-04-10  发布在  Java
关注(0)|答案(7)|浏览(178)

我想从我的c#/java程序中获取域名的whois信息。有没有简单的方法可以做到这一点?

t98cgbkg

t98cgbkg1#

我在www.example.com上找到了一个完美的C#示例dotnet-snippets.com(* 它已经不存在了 *)。
这是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();
}
zpf6vheq

zpf6vheq2#

我认为,最简单的方法是在端口43上连接到whois服务器的套接字。发送域名,后跟一个换行符,并读取响应。

8iwquhpp

8iwquhpp3#

托马斯的答案只有在你知道要连接到哪个“whois”服务器的情况下才有效。
有许多不同的方法可以找到它,但没有一种(AFAIK)可以统一适用于每个域注册表。
一些域名在DNS中支持_nicname._tcp服务的SRV记录,但存在问题,因为目前还没有公认的标准来防止子域提供覆盖官方注册表的SRV记录(参见https://datatracker.ietf.org/doc/html/draft-sanz-whois-srv-00)。
对于许多顶级域名来说,可以将您的查询发送到<tld>.whois-servers.net。这实际上工作得很好,但要注意,它并不适用于所有官方授权的二级域名。
例如,在.uk中有几个官方子域,但只有其中一些由.uk注册中心运行,其他的有自己的WHOIS服务,而这些服务不在whois-servers.net数据库中。
令人困惑的是,还有一些“非官方”的注册表,比如.uk.com,它们在whois-servers.net数据库中。
p.s. WHOIS中的官方行尾定界符,与大多数IETF协议一样,是CRLF,而不仅仅是LF

j9per5c4

j9per5c44#

我找到了一些提供这些信息的网络服务。这个是免费的,对我来说效果很好。http://www.webservicex.net/whois.asmx?op=GetWhoIS

ippsafx7

ippsafx75#

我在这里找到了一个完美的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());
            }
         }
      }
   }
}
cs7cruho

cs7cruho6#

如果您将leaveOpen: true添加到StreamWriterStreamReader构造函数,则不会出现“无法访问已关闭的流”异常

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());
        }
    }
}
kx5bkwkv

kx5bkwkv7#

下面是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();
    }
}

相关问题