gpt4 book ai didi

Javasocks代理使用本地DNS

转载 作者:行者123 更新时间:2023-12-02 12:57:45 31 4
gpt4 key购买 nike

我正在尝试通过 SOCKS 代理连接到 Oracle 数据库,因为我无法直接访问 Oracle 服务器。因此,我在端口 4000 上打开代理,并将这些选项添加到我的应用程序中:

-DsocksProxyHost=localhost -DsocksProxyPort=4000

现在,如果我在连接字符串中使用 Oracle 服务器的主机名启动应用程序,则会收到“指定的未知主机”。如果我使用 IP 地址而不是主机名,则连接成功。我猜 java 正在尝试使用本地 DNS 而不是远程 DNS 来解析主机名。如何使用远程 DNS?

最佳答案

在当前的 OpenJDK 实现中,您可以使用不受支持的解决方法来解决此问题。它可能会在未来版本中被删除。 SOCKS 实现确实支持远程 DNS 查找。但是,这只适用于未解析的 InetSocketAddress 对象。不幸的是,URL.openConnection 使用的 NetworkClient 类总是尝试解析 InetSocketAddress,即使使用 SOCKS 时也是如此。您可以使用技巧来阻止本地名称解析。

通过使用 -Djdk.net.hosts.file=some_file 命令行参数,或者尽早从代码中设置属性(第一件事),将(内部)系统属性 jdk.net.hosts.file 设置为文件名在主要)。这必须在执行内部 NameService 类初始值设定项之前完成,否则将无法工作:

System.setProperty("jdk.net.hosts.file", "some_file");

在当前基于 OpenJDK 的 Java 运行时中,这会将域名解析更改为该文件而不是通常的 DNS。缺少条目或不存在的主机文件会导致无法解析的 InetSocketAddress。这正是我们所需要的,因为 SOCKS 实现现在将使用远程 DNS。

但请注意,您的代理服务器的解析将不再起作用,因此您必须指定代理服务器的 IP 地址。您还可以将代理服务器添加到 some_file。您的应用程序中可能需要的其他 DNS 解析也不起作用。

关于Javasocks代理使用本地DNS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44369862/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com