【发布时间】:2016-02-17 09:38:05
【问题描述】:
Socket 的 ctor 具有将服务器作为字符串或 InetAddress 的版本。是否缓存了 DNS 查找的结果,以便另一个构造的 Socket 将跳过执行查找并使用缓存的值(如果可用)?如果是这样,这是否适用于两个版本,还是只适用于采用 InetAddress 的版本?
【问题讨论】:
-
是的。 DNS 查找由解析器缓存。
-
@ElliottFrisch Java 文档只讨论了 InetAddress 下的缓存,说该类有一个缓存(我假设这意味着它在该类的所有对象之间共享)。但是,当使用接受字符串而不是 InetAddress 的 Socket ctor 时呢?可以假设有一个内部 InetAddress 也共享该缓存吗?
-
@DisplayName 该构造函数使用
InetAddress来解析名称。这是同一个缓存。 -
这是因为 DNS 名称解析是由
gethostbyname2()完成的(这是本机代码,它与系统上每个程序的解析过程相同 - 所以它是系统级缓存)。 -
@ElliottFrisch 我不关注。这是一个 GNU 扩展,它不维护缓存。 Java 就是这样做的。
标签: java sockets networking dns nio