【发布时间】: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