2011-04-08 132 views
24

我正在制作点对点即时消息应用程序。获取本地计算机的DNS名称,如远程计算机所示

目前,如果UserA.pool.net对UserB.pool.net显示“hello”,则用户A看到“You:hello”,用户B看到“UserA.pool.net:hello”。

而不是用户A看到的“你”,我希望他们看到自己的机器的主机名,使用户A看到相同的文字作为用户B.

+3

[Java当前计算机名称和登录用户?]的可能重复(http://stackoverflow.com/questions/473446/java-current-machine-name-and-logged-in-user) – 2011-04-08 14:48:11

+0

这有点儿比Jonathon更复杂......如果你在NAT层后面,用户A和用户B绝对不会看到相同的东西。 – 2011-04-08 14:50:37

+2

你是对的,每个参与者都需要向另一方报告他们自己的(内部)主机名。 – 2011-04-08 14:51:53

回答

14

简短的回答是,如果你真的希望用户A和用户B看到相同的文本,你不能依靠自己找出你的主机名。您需要用户B将用户A的主机名称视图发送给用户A,反之亦然。由于NAT,您将无法检查自己的计算机主机名。

或者,(Jonathon在问题评论中击败了我)你可以让每个用户发送他们自己的私有主机名作为连接握手的一部分,并用它在远程端打印消息。

14

我已经得到了本地机器的主机名在使用这样的事情过去:

InetAddress addr = InetAddress.getLocalHost(); 

String hostname = addr.getHostName(); 

你可以参考:InetAddress.getHostName()

79

见java.net.InetAddress中的这些功能 - getLocalHostgetHostName

String localhostname = java.net.InetAddress.getLocalHost().getHostName(); 

请注意,这会让您获得主机名称,因为机器会看到它自己;其他人可能会看到一个不同的(例如,本地hosts文件说的东西不同于DNS)。换句话说,并不能保证机器A将会被机器A,机器B或机器C看到具有相同的主机名称。

正如@biniam_Ethiopia指出的那样,甚至不能保证你会得到同一机器上不同程序的结果相同,因为它们可能使用基于网络的名称解析(例如,参见here)。

发送整个标识符可能更有用:[email protected],而不仅仅是piskvor

+1

这在某些情况下并不理想。特别是如果当前主机名被设置但本地dns服务器无法识别,则InetAddress.getLocalHost()将引发异常。令人烦恼的是,没有使用反射来从InetAddress的内部刮取数据,没有解决方法。 – 2013-06-15 10:01:40

+0

如果主机有多个NIC并因此有多个名称和IP地址,该怎么办?什么名字将被返回? – Lawrence 2013-09-17 13:09:46

+0

@劳伦斯:我不认为这是一个明确的命令 - 你可能会得到任何一个。 – Piskvor 2013-09-20 20:32:27

5

您可能需要使用getCanonicalHostName()来获取包含域名的全限定主机名。

代码 - 字符串fullHostName = java.net.InetAddress.getLocalHost()getCanonicalHostName();

相关问题