我正在尝试提供一个程序,将计算机从 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天。
感谢任何帮助。
答案 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
; - )。