返回信息流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 抓的,是不是还要传什么数据啊?
这是一条镜像帖。来源:北邮人论坛 / soft-design / #6567同步于 2006/4/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
关于代理(java)
chaobill
2006/4/21镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复