2010-05-14 97 views

回答

6

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

SOCKS協議,如在RFC 1928中定義,提供了一個框架的客戶端服務器應用程序無論是在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代理服務器在socks.mydomain.com:1080。

現在,當定義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代理,那麼該代理將被使用。

+0

這是否也會導致UDP連接(Dgram)通過指定的代理? – hexafraction 2013-05-20 20:37:08

2

因爲截拳道1.5,還可以通過編程插座配置代理服務器:

例如:

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

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

Socket s = new Socket(proxy); 

您還可能希望把這個代碼的SocketFactory。