怎样通过java使用socks代理访问服务器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样通过java使用socks代理访问服务器相关的知识,希望对你有一定的参考价值。
package test;import java.io.IOException;
import java.util.Date;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.PostMethod;
public class test
public static void main(String args[])
HttpClient hc = new HttpClient();
System.out.println("开始时间:" + System.currentTimeMillis());
for (int i = 0; i <= 100; i++)
try
//每10秒才会保存一次
Thread.sleep(12000);
catch (InterruptedException e1)
// TODO Auto-generated catch block
e1.printStackTrace();
Date d = new Date();
PostMethod pm = new PostMethod(
"http://www.tongaichina.com/post.asp?type=int&name=click&time="
+ d.getTime());
try
//这里写代理地址及端口
hc.getHostConfiguration().setProxy("代理地址", 端口);
//这里是用户名与密码
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(
"用户名", "密码");
hc.getState().setProxyCredentials(AuthScope.ANY, creds);
hc.executeMethod(pm);
System.out.println(pm.getResponseBodyAsString());
catch (HttpException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(i);
System.out.println("结束时间:" + System.currentTimeMillis());
参考技术A 开发socks5代理服务器_IT/计算机_专业资料。摘要:用Java语言成功开发了一个...支持常见的HTTP代理和Sock4、Sock5代理,可以以用于局域网中,socket代理来连接到外网, 这里是java使用代理连接到...// 设置不需要通过代理服务器访问的主机,可以使用*...prop.setProperty("socksProxyHost",本回答被提问者采纳
Java socks 代理使用本地 DNS
【中文标题】Java socks 代理使用本地 DNS【英文标题】:Java socks proxy uses local DNS 【发布时间】:2017-06-05 13:16:18 【问题描述】:我正在尝试通过 SOCKS 代理连接到 oracle 数据库,因为我没有直接访问 oracle 服务器的权限。 因此,我在端口 4000 上打开代理,并将这些选项添加到我的应用程序中:
-DsocksProxyHost=localhost -DsocksProxyPort=4000
现在,如果我在连接字符串中使用 oracle 服务器的主机名启动我的应用程序,那么我会得到一个“指定的未知主机”。 如果我使用 IP 地址而不是主机名,则连接成功。 我猜java正在尝试使用我的本地DNS而不是远程DNS来解析主机名。如何使用远程 DNS?
【问题讨论】:
它使用的是哪个版本的 SOCKS? SOCKS4 要求客户端解析主机名。 SOCKS 4a 提供了一种将名称发送到服务器以解析 IP 地址的方法,而 SOCKS5 还允许服务器解析名称(是否这样做由客户端指定)。 我使用的是 v5(socksProxyVersion 的默认值)。你告诉 SOCKS5 允许服务器解析名称。问题是目前我的客户正在尝试解析名称,所以我得到了一个异常。 它是什么客户端? SOCKS 的结构性问题之一(例如,如果它位于客户端下方的库中)通常客户端在建立连接之前解析 DNS,而使用 SOCKS 时,解析和连接是在同一个请求中一起完成的。各种自动 SOCKS 客户端通过挂钩 DNS 查找并返回虚假地址(当他们在 SOCKS 中看到连接请求时用来识别原始目标名称)来解决此问题。 客户端是Java7 RE(JDBC连接)。 有东西要求 Java 建立连接。 【参考方案1】:在当前的 OpenJDK 实现中,您可以为此使用不受支持的解决方法。它可能会在未来的版本中被删除。 SOCKS 实现确实支持远程 DNS 查找。但是,这只适用于未解析的 InetSocketAddress 对象。不幸的是,URL.openConnection 使用的 NetworkClient 类总是尝试解析 InetSocketAddress,即使使用 SOCKS 也是如此。您可以使用一个技巧来阻止本地名称解析。
将(内部)系统属性 jdk.net.hosts.file 设置为文件名,方法是使用 -Djdk.net.hosts.file=some_file 命令行参数,或者足够早地从代码中设置属性(第一件事主要)。这必须在执行内部 NameService 类初始化程序之前完成,否则这将不起作用:
System.setProperty("jdk.net.hosts.file", "some_file");
在当前基于 OpenJDK 的 Java 运行时中,这会将域名解析更改为该文件,而不是通常的 DNS。缺少条目或不存在主机文件会导致 InetSocketAddress 无法解析。这正是我们在这里所需要的,因为 SOCKS 实现现在将使用远程 DNS。
但是请注意,您的代理服务器的解析将不再起作用,因此您必须指定代理服务器的 IP 地址。您还可以将代理服务器添加到 some_file。您的应用程序中可能需要的其他 DNS 解析也不起作用。
【讨论】:
我认为这不起作用(不再):Unable to resolve host <redacted> in hosts file foo
for -Djdk.net.hosts.file=foo
。【参考方案2】:
这是 jvm 的 bug,似乎没有立即修复它的计划。
SOCKS 真的很老了。没有广泛部署在现代基础设施中。将优先级降低到 P4。
【讨论】:
你的意思是没有计划修复它 @jaudo 感谢您的提醒,是的,您是对的,错过了 no,我更新了答案。以上是关于怎样通过java使用socks代理访问服务器的主要内容,如果未能解决你的问题,请参考以下文章