如何解析远程计算机名称以获取它在java中的IP地址

时间:2015-07-03 15:58:49

标签: java dns network-programming jndi

我正在尝试提供一个程序,将计算机从 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天。

感谢任何帮助。

2 个答案:

答案 0 :(得分: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范围的地址。

答案 1 :(得分:0)

您是否阅读过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服务器而不是{1}},请使用FQDN(完全限定的域名),如您的例外中所示。谷歌不希望了解clientname; - )。