簡體   English   中英

如何在Java中解析遠程計算機名稱以獲取IP地址

[英]How to resolve a remote computer name to get it IP address in java

我正在嘗試提出一個程序,將數據包從計算機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天。

任何幫助表示贊賞。

僅當您需要特定的DNS屬性/條目時,才使用JNDI

也許以下更適合您:

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范圍的地址。

您是否閱讀了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”);

使用FQDN(完全限定域名),如果你會使用公共DNS服務器,而不是clientname狀顯示在您的例外。 谷歌不希望一無所知clientname ;-)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM