Java 获取远程计算机看到的本地计算机的DNS名称

Java 获取远程计算机看到的本地计算机的DNS名称,java,networking,Java,Networking,我正在制作一个点对点即时消息应用程序 目前,如果UserA.pool.net对UserB.pool.net说“你好”,那么用户A会看到“You:hello”,用户B会看到“UserA.pool.net:hello” 我不希望用户A看到“你”,而是希望他们看到自己机器的主机名,这样用户A就可以看到与用户B相同的文本。我过去使用类似的方法获得本地机器的主机名: InetAddress addr = InetAddress.getLocalHost(); String hostname = addr

我正在制作一个点对点即时消息应用程序

目前,如果UserA.pool.net对UserB.pool.net说“你好”,那么用户A会看到“You:hello”,用户B会看到“UserA.pool.net:hello”


我不希望用户A看到“你”,而是希望他们看到自己机器的主机名,这样用户A就可以看到与用户B相同的文本。

我过去使用类似的方法获得本地机器的主机名:

InetAddress addr = InetAddress.getLocalHost();

String hostname = addr.getHostName();

您可以参考:

查看java.net.InetAddress的这些函数-以及:

请注意,这会在机器看到自己时获取主机名;其他人可能会用不同的名称看到它(例如,本地
hosts
文件表示与DNS不同的内容)。换句话说,不能保证机器A与机器A、机器B或机器C的主机名相同

正如@biniam_埃塞俄比亚所指出的,甚至不能保证您从同一台机器上的不同程序中获得相同的结果,因为它们可能使用基于网络的名称解析(例如)


发送整个标识符可能更有用:
piskvor@lachtan.my.network.example.com
,而不仅仅是
piskvor

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


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

您可能需要使用getCanonicalHostName()来获得完整的限定主机名,其中也包括域名

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

可能的复制比Jonathon要复杂一些…如果你在NAT层后面,用户a和用户B肯定看不到相同的东西。你是对的,每个参与者都需要向另一方报告他们自己的(内部)主机名。请看,在某些情况下,这并不理想。特别是,如果设置了当前主机名但本地dns服务器无法识别,则InetAddress.getLocalHost()将引发异常。令人恼火的是,如果不使用反射从InetAddress的内部刮取数据,就没有可用的解决方法。如果主机有多个NIC,从而有多个名称和IP地址,该怎么办?将返回什么名称???@Lawrence:我认为这没有定义的顺序-您可能会得到其中任何一个。此方法存在漏洞/问题@埃塞俄比亚比尼亚姆:谢谢你的提醒;这就是我第二段的重点。“InetAddress.getHostName()正在使用O/s中配置的命名服务(DNS)对服务器的IP地址进行反向查找”是一种特定的方式,表示“不保证机器a会被机器a、机器B或机器C以相同的主机名看到”。但您是对的,这一点在回答中并不明显;编辑以澄清。
String localhostname = java.net.InetAddress.getLocalHost().getHostName();