java中的袜子(通过袜子打开)

Posted

技术标签:

【中文标题】java中的袜子(通过袜子打开)【英文标题】:socks in java (opening via socks) 【发布时间】:2010-05-14 14:05:00 【问题描述】:

如何向我的应用程序添加 SOCKS 支持?我在哪里可以得到库?

【问题讨论】:

【参考方案1】:

来自http://java.sun.com/javase/6/docs/technotes/guides/net/proxies.html

RFC 1928 中定义的 SOCKS 协议为客户端服务器应用程序提供了一个框架,可以在 TCP 和 UDP 级别安全地穿越防火墙。从这个意义上说,它比更高级别的代理(如 HTTP 或 FTP 特定代理)更通用。 J2SE 5.0 为客户端 TCP 套接字提供 SOCKS 支持。

有 2 个与 SOCKS 相关的系统属性:

socksProxyHost为SOCKS代理服务器的主机名socksProxyPort为端口号,默认值为1080

注意这次前缀后面没有点('.')。这是出于历史原因并确保向后兼容。一旦以这种方式指定了 SOCKS 代理,所有 TCP 连接都将通过该代理进行尝试。

例子:

$ java -DsocksProxyHost=socks.mydomain.com GetURL

这里,在代码执行过程中,每一个传出的 TCP 套接字都会经过位于 socks.mydomain.com:1080 的 SOCKS 代理服务器。

现在,如果同时定义了 SOCKS 代理和 HTTP 代理,会发生什么?规则是更高级别协议的设置,如 HTTP 或 FTP,优先于 SOCKS 设置。因此,在这种特殊情况下,当建立 HTTP 连接时,将忽略 SOCKS 代理设置并联系 HTTP 代理。我们来看一个例子:

$ java -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080 -DsocksProxyHost=socks.mydomain.com GetURL

这里,http URL 将通过 webcache.mydomain.com:8080,因为 http 设置优先。但是 ftp URL 呢?由于没有为 FTP 分配特定的代理设置,并且由于 FTP 位于 TCP 之上,因此将通过位于 socks.mydomsain.com:1080 的 SOCKS 代理服务器尝试 FTP 连接。如果已指定 FTP 代理,则将使用该代理。

【讨论】:

这是否也会导致UDP连接(Dgram)通过指定的代理?【参考方案2】:

从 jkd 1.5 开始,您还可以通过 Socket 以编程方式配置代理:

例如:

SocketAddress sa = InetSocketAddress.createUnresolved("mysocksproxy.com", 1080);

Proxy proxy = new Proxy(Proxy.Type.SOCKS, sa);

Socket s = new Socket(proxy);

您可能还想将此代码放在 SocketFactory 中。

【讨论】:

以上是关于java中的袜子(通过袜子打开)的主要内容,如果未能解决你的问题,请参考以下文章

mysql代理袜子

从洗袜子到hbase存储原理解析

袜子上的 Python ssh 客户端(代理)

如何在应用程序中访问代理详细信息(袜子和 http)?

生活现场从洗袜子到hbase存储原理解析(上篇)

php - 袜子代理