BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #6567同步于 2006/4/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

关于代理(java)

chaobill
2006/4/21镜像同步1 回复
1、HTTP代理 HTTP代理可以把我們的HTTP請求通過HTTP代理服務器轉發到我們要訪問的HTTP服務器,再把 結果返回給我們,以達到代理的目的。但其功能單一,只能實現HTTP的代理,具體可以查看RFC 2068、2616等相關RFC文檔。 正常情況下,我們請求HTTP服務是這樣的:首先和目的服務器的HTTP服務端口建立TCP連接,然後做類似「GET /index.html HTTP/1.0」的請求,HTTP服務器返回結果。當通過HTTP代理的時候是這樣工作的:首先和HTTP代理服務器的服務端口建立TCP連接,然後做 類似「GET http://目標服務器地址/index.htm HTTP/1.0」的請求,代理服務器對你的目標服務器做請求後返回結果給你。 相關的代碼在網上很容易可以找到,這裡就不列舉了。 2、socks代理 socks是一個簡單靈活的協議框架,包括4和5兩個版本,sock5是由IETF核准的基於TCP/IP協議的基本應用程序代理協議, socks由兩個部分組成,服務端和客戶端。具體信息可以查看RFC 1928相關文檔,在網上也可以搜索到許多基於socks5的開源項目,對照RFC文檔,你可以了解這個協議的使用。 『以下信息來直接摘自互聯網』 sock5代理客戶端的工作程序是: 1.客戶端向代理方服務器發出請求信息。 2.代理方服務器應答 3.客戶端接到應答後發送向代理方服務器發送目的ip和端口 4.代理方服務器與目的連接 5.代理方服務器將客戶端發出的信息傳到目的方,將目的方發出的信息傳到客戶端。代理完成。 由於網上的信息傳輸基本上都是運用tcp或udp進行的,所以使用socks5代理可以辦到網上所能辦到的一切,而且不用擔心目的方會查到你的ip,既安全又方便。 如何用代理TCP協議: 1.向服務器的1080端口建立tcp連接。 2.向服務器發送 05 01 00 (此為16進制碼,以下同) 3.如果接到 05 00 則是可以代理 4.發送 05 01 00 01 + 目的地址(4字節) + 目的端口(2字節),目的地址和端口都是16進制碼(不是字符串)。 例202.103.190.27 - 7201 則發送的信息為:05 01 00 01 CA 67 BE 1B 1C 21 (CA=202 67=103 BE=190 1B=27 1C21=7201) 5.接受服務器返回的自身地址和端口,連接完成 6.以後操作和直接與目的方進行TCP連接相同。 如何用代理UDP連接 1.向服務器的1080端口建立udp連接 2.向服務器發送 05 01 00 3.如果接到 05 00 則是可以代理 4.發送 05 03 00 01 00 00 00 00 + 本地UDP端口(2字節) 5.服務器返回 05 00 00 01 +服務器地址+端口 6.需要申請方發送 00 00 00 01 +目的地址IP(4字節)+目的端口 +所要發送的信息 7.當有數據報返回時 向需要代理方發出00 00 00 01 +來源地址IP(4字節)+來源端口 +接受的信息 我的代码想 验证代理服务器 package chaobill; import java.net.*; import java.io.*; public class MainTestCase { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MainTestCase mytestcase=new MainTestCase(); mytestcase.test(); } public void test() { try{ String headerString= "GET / HTTP/1.1\r\nHost: www.163.com\r\nAccept: */*\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nConnection: close\r\n\r\n"; char[] header=headerString.toCharArray(); Socket socket=new Socket(InetAddress.getByName("218.11.207.244"),80) ; BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream())); //BufferedReader line=new BufferedReader(new InputStreamReader(System.in)); PrintWriter out=new PrintWriter(socket.getOutputStream(),true); out.print(header); out.flush(); String sInput=null; boolean done=false; while(!done){ sInput=in.readLine(); System.out.println(sInput); if(sInput==null || sInput=="")done=true; } //line.close(); in.close(); socket.close(); System.out.println("done"); /* String info; info = input.readLine(); System.out.println(info); boolean done = false; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String sInput; while(!done){ sInput = in.readLine(); out.println(sInput); if (sInput.equalsIgnoreCase("bye")) done = true; info = input.readLine(); System.out.println(info); } */ }catch(Exception e){ System.out.println(e); } } } //218.11.207.244代理服务器老是返回 HTTP/1.1 400 Bad Request Header 是我用 FlashGet 抓的,是不是还要传什么数据啊?
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
atian25机器人#1 · 2006/4/21
赞... +U