【问题标题】:How to resolve a remote computer name to get it IP address in java如何解析远程计算机名称以在java中获取IP地址
【发布时间】:2015-07-03 15:58:48
【问题描述】:

我正在尝试编写一个程序,将数据包从计算机 A 发送到计算机 B。两台计算机都必须有我的 java 程序的副本。这需要在 JTextField 对象中输入远程计算机的名称B,在 JTextArea 对象中输入消息,然后单击按钮发送。

我的程序应该能够将给定的计算机名称解析为 IP 地址,以便将 IP 地址作为参数包含在我的 DatagramPacket 构造函数中。

我尝试使用以下方法进行解析,但我得到了 javax.naming.CommunicationException

String clientname="user";
Hashtable<String,Object> env=new Hashtable<String,Object>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
        env.put(Context.PROVIDER_URL,"dns://www.google.com");
        DirContext con=new InitialDirContext(env);
       Object obj=con.lookup("clientname");

抛出异常

javax.naming.CommunicationException: DNS error [Root exception is java.net.SocketTimeoutException: Receive timed out]; remaining name 'user'
at com.sun.jndi.dns.DnsClient.query(DnsClient.java:300)
at com.sun.jndi.dns.Resolver.query(Resolver.java:81)
at com.sun.jndi.dns.DnsContext.c_lookup(DnsContext.java:286)
at com.sun.jndi.toolkit.ctx.ComponentContext.p_lookup(ComponentContext.java:544)
at com.sun.jndi.toolkit.ctx.PartialCompositeContext.lookup(PartialCompositeContext.java:177)
at com.sun.jndi.toolkit.ctx.PartialCompositeContext.lookup(PartialCompositeContext.java:166)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
Caused by: java.net.SocketTimeoutException: Receive timed out
at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)
at java.net.DualStackPlainDatagramSocketImpl.receive0(DualStackPlainDatagramSocketImpl.java:121)
at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:145)
at java.net.DatagramSocket.receive(DatagramSocket.java:786)
at com.sun.jndi.dns.DnsClient.doUdpQuery(DnsClient.java:411)
at com.sun.jndi.dns.DnsClient.query(DnsClient.java:203)
... 7 more

问题

我如何才能实现我的目标,因为在我看来 java DNS 服务提供商只能解析域名而不是单个计算机名称?我已经为此苦苦挣扎了 3 天。

任何帮助表示赞赏。

【问题讨论】:

  • www.google.com 不是 DNS 服务器。它是一个 WEB 服务器。如果你想使用google的公共dns,那么ip是8.8.8.8
  • @MarcB 我已将 www.google.com 替换为 8.8.8.8,但出现以下异常:javax.naming.NameNotFoundException: DNS name not found [response code 3];即使我将计算机名称 user 替换为另一个计算机名称,剩余名称 'user' 也是如此。
  • 那么可能是google-public-dns-a.google.com,也就是8.8.8.8的反向映射
  • @MarcB 同样的错误。该声明似乎找不到 google-public-dns-a.google.com。兄弟还有其他选择吗?
  • @MarcB 我已更改为 8.4.4.4 的其他 google dns 但我收到另一个错误 javax.naming.CommunicationException: DNS 错误 [根异常是 java .net.SocketTimeoutException: 接收超时];剩余名称'用户

标签: java dns network-programming jndi


【解决方案1】:

JNDI 的使用仅在您需要特定 DNS 属性/条目时才有用。

也许以下更适合你:

final InetAddress inetAddress = InetAddress.getByName("clientname");
final String ipAddress = inetAddress.getHostAddress();

将使用本地 DNS 基础设施 - 就像它所使用的操作系统一样 - 您无需自己提供 DNS 服务器。

http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html

http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getByName%28java.lang.String%29

根据主机名确定主机的 IP 地址。

主机名可以是机器名称,例如“java.sun.com”,也可以是其 IP 地址的文本表示。如果提供的是文字 IP 地址,则只检查地址格式的有效性。

对于以文字 IPv6 地址指定的主机,接受 RFC 2732 中定义的格式或 RFC 2373 中定义的文字 IPv6 地址格式。还支持 IPv6 范围的地址。

【讨论】:

  • 我要找的东西! 我以为inetAddress.getHostAddress() 只能检索本地机器人的IP 地址。问题解决了。任务 101 完成。
【解决方案2】:

你读过http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/jndi-dns.html吗?

看起来像:

Hashtable env = new Hashtable();
env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
env.put("java.naming.provider.url",    "dns://google-public-dns-a.google.com");

DirContext ictx = new InitialDirContext(env);
Attributes attrs1 = ictx.getAttributes("clientname", new String[] {"A"});

是你想要的。

超时值可以配置:

env.put("com.sun.jndi.dns.timeout.initial", "2000");

env.put("com.sun.jndi.dns.timeout.retries", "3");

如果您将使用公共 DNS 服务器而不是 clientname,请使用 FQDN(完全限定域名),如您的例外中所示。 Google 不希望知道任何关于 clientname 的信息 ;-)。

【讨论】:

  • 我唯一得到的是域的 IP 地址。例如 www.yahoo.com但是 我想要的是我朋友在局域网上运行的计算机的 IP 地址。不是某个网络服务器的 IP 地址。这就是我一直在尝试的 barthel。
  • 您在 LAN 中使用 DNS 服务器还是 IP 地址“硬编码”?您问题中的错误消息告诉我,您想向 Google 询问主机 clientname 的 IP。如果有,请改用您的内部 DNS 服务器。
  • 我们的内部 DNS 服务器 IP 地址是 8.8.8.8,与 google-public-dns-a.google.com 相同。当我解析 yahoo.com 时,我得到了它的 IP 地址,但是当我解析我的同事笔记本电脑时,我得到了错误!例如解析计算机名称 mycomp-PC
  • 8.8.8.8Google 的 DNS 服务器。但是mycomp-PC 没有在 Google 的 DNS 中注册。您必须提供自己的 DNS 或使用您的互联网服务提供商提供的 DNS。
  • 我尝试过使用我的 ISP DNS,但都是徒劳的。我认为设置我自己的 DNS 似乎是最后的选择。但在此之前,你认为路由器可以在这个例外中发挥作用吗?因为我们确实有一个路由器,而且据我所知,它可以防止从 WAN 上的计算机(DNS 服务器)直接连接到 LAN 上的计算机。你知道的,那种东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2012-10-28
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
相关资源
最近更新 更多