Socket程式設計--自己動手的HTTP代理伺服器
瀏覽器使用代理:Firefox瀏覽器:
選項->高階->連線->設定,選擇手動配置代理。
實現http代理:
1.等待來自一個客戶端的連線;
2.啟動一個新執行緒來處理連線;
InputStream cis = null,sis=null;
OutputStream cos = null,sos=null;
try{
csocket.setSoTimeout(TIMEOUT);
cis=csocket.getInputStream();
cos=csocket.getOutputStream();
}
上面的程式碼定義了代理伺服器與目標伺服器間套接字並初試化,其中cis為客戶端輸入流,sis為目標主機輸入流,socket為套接字。同時設定了超時控制,如果某個Socket不可用,另一個仍舊有機會進行處理,不必建立一個新的執行緒。
我的類直接從Thread類繼承了下來.並且通過建構函式傳遞引用和客戶Socket建立了聯絡.這樣每個執行緒就有了一個通訊管道(pipe)。同樣重寫run方法,把代理工作交給執行緒來完成。這樣多客戶並行的Socket就建立起來了
3.讀瀏覽器請求的第一行(包含終點url的行);
4.解析請求第一行中終點Http伺服器名及其埠號;
URL=getRequestURL(buffer);
int n;
n=URL.indexOf(“//”);
if (n!=-1)
host=URL.substring(n+2); // www.baidu.com/
n=host.indexOf(‘/’);
if (n!=-1)
host=host.substring(0,n);// www.baidu.com
// 分析可能存在的埠號
n=host.indexOf(‘:’);
if (n!=-1) {
port=Integer.parseInt(host.substring(n+1));
host=host.substring(0,n);
}
5.開啟一個到終點Http伺服器的套接字;
while (retry–!=0) {
try {
//與目標伺服器建立連線
ssocket=new Socket(host,port); //嘗試建立與目標主機的連線
break;
} catch (Exception e) { }
Thread.sleep(CONNECT_PAUSE);//執行緒等待幾毫秒
}
6.通過該套接字傳送/Http請求;
if(ssocket!=null){
ssocket.setSoTimeout(TIMEOUT);//設定套接字超時時間
sis=ssocket.getInputStream();
sos=ssocket.getOutputStream();//從sscoket中得到輸出流
sos.write(buffer.getBytes()); //將請求頭寫入,向目標伺服器輸出http命令
7.傳送從終點Http伺服器(通過套接字)返回給瀏覽器請求的資料;
pipe(cis,sis,sos,cos); 這個方法用來實現套接字之間的資料交換。
8.關閉套接字,等待下一次連線。
由於關閉套接字時會拋異常,所以我用try,catch來包圍程式碼塊。
Socket 程式設計的客戶端和伺服器端主要步驟
1.編寫伺服器端,例項化ServerSocket物件,這裡要定義ip和埠,例項化Socket,從ServerSocket物件中accept() 獲取,這裡要涉及到流,輸入輸出流在Socket中獲取。
2.編寫客戶端,例項化Socket物件,ip,埠,流,在Socket中獲取:
1.建立伺服器端SocketServer,並定義SocketServer的監聽埠;
2、ServerSocket呼叫accept( )方法,是指處於阻塞;
3、建立客戶端的Socket,並設定伺服器的IP和埠;
4、客戶端傳送連線請求,建立連線;
5、分別取得伺服器和客戶端Socket的InputStream和OutputStream;
6、利用Socket和ServerSocket進行資料傳輸
HTTP 代理伺服器的基本原理:
HTTP 客戶端向代理髮送請求報文,代理伺服器需要正確地處理請求和連線(例如正確處理 Connection: keep-alive),同時向伺服器傳送請求,並將收到的響應轉發給客戶端。
HTTP 代理伺服器的程式流程圖
實現 HTTP 代理伺服器的關鍵技術及解決方案:
理解Socket程式設計技術,分析HTTP代理應用程式設計原理和程式流程,選擇合適的開發環境,參考已有的HTTP程式功能,設計實現HTTP代理功能的應用程式。
解決方案:Java實現socket程式設計並實現多執行緒。