我正在制作点对点即时消息应用程序。获取本地计算机的DNS名称,如远程计算机所示
目前,如果UserA.pool.net对UserB.pool.net显示“hello”,则用户A看到“You:hello”,用户B看到“UserA.pool.net:hello”。
而不是用户A看到的“你”,我希望他们看到自己的机器的主机名,使用户A看到相同的文字作为用户B.
我正在制作点对点即时消息应用程序。获取本地计算机的DNS名称,如远程计算机所示
目前,如果UserA.pool.net对UserB.pool.net显示“hello”,则用户A看到“You:hello”,用户B看到“UserA.pool.net:hello”。
而不是用户A看到的“你”,我希望他们看到自己的机器的主机名,使用户A看到相同的文字作为用户B.
简短的回答是,如果你真的希望用户A和用户B看到相同的文本,你不能依靠自己找出你的主机名。您需要用户B将用户A的主机名称视图发送给用户A,反之亦然。由于NAT,您将无法检查自己的计算机主机名。
或者,(Jonathon在问题评论中击败了我)你可以让每个用户发送他们自己的私有主机名作为连接握手的一部分,并用它在远程端打印消息。
我已经得到了本地机器的主机名在使用这样的事情过去:
InetAddress addr = InetAddress.getLocalHost();
String hostname = addr.getHostName();
见java.net.InetAddress中的这些功能 - getLocalHost和getHostName:
String localhostname = java.net.InetAddress.getLocalHost().getHostName();
请注意,这会让您获得主机名称,因为机器会看到它自己;其他人可能会看到一个不同的(例如,本地hosts
文件说的东西不同于DNS)。换句话说,并不能保证机器A将会被机器A,机器B或机器C看到具有相同的主机名称。
正如@biniam_Ethiopia指出的那样,甚至不能保证你会得到同一机器上不同程序的结果相同,因为它们可能使用基于网络的名称解析(例如,参见here)。
发送整个标识符可能更有用:[email protected]
,而不仅仅是piskvor
。
您可能需要使用getCanonicalHostName()来获取包含域名的全限定主机名。
代码 - 字符串fullHostName = java.net.InetAddress.getLocalHost()getCanonicalHostName();
[Java当前计算机名称和登录用户?]的可能重复(http://stackoverflow.com/questions/473446/java-current-machine-name-and-logged-in-user) – 2011-04-08 14:48:11
这有点儿比Jonathon更复杂......如果你在NAT层后面,用户A和用户B绝对不会看到相同的东西。 – 2011-04-08 14:50:37
你是对的,每个参与者都需要向另一方报告他们自己的(内部)主机名。 – 2011-04-08 14:51:53