導航:首頁 > IDC知識 > 代理伺服器開發

代理伺服器開發

發布時間:2021-02-24 08:18:05

1、java 開發一個http的代理伺服器

說實話,你的問題很那個。。
不過應該也能實現。
現在問題主要是由於b不能訪問c,所以c只能使用TimerTask定時去訪問b。
b有2個listener,一個負責偵聽來自a的請求,一個負責偵聽來自b的。

b中應該會使用到多線程。
下面定義a的Request為x,c的Request為y
由於b會有多個來自a轉發的請求,可能會有x1\x2\x3等很多並發的請求,所以b在初始化的時候就需要建立一個等待池.
等待池應該是單例且線程同步的,x一來就new object(request,response),然後放入list。
c的定時器一到,就訪問b開放給c的listener,request y。y首先遍歷等待池,取出x的request,然後用取出x的response的返回給a。直到等待池為空為止,然後y response給c。

不過要注意的是
1)你會發現,由於c給b的數據應該是放到request y裡面作為參數來傳的。
2)a的請求如果需要c不同數據介面的數據,那c-->b的request y里就應該包含所有的數據,然後在遍歷等待池的時候根據a-->b的request x的id(可以使用sessionid)來區分取哪個。
3)最差的情況,
1,a源源不斷的發出x請求,c的request遍歷就死循環。
2,如果c的定時時間太短,y1還沒完,y2就來了。
3,a源源不斷的發出x請求,但是某一請求Xn就無法搶到資源,Xn就掛掉。

這裡面很多處理你還要多加控制。

這個想法沒實驗過,其實如果b可以訪問c,其實什麼問題都沒有了
最後問一句,誰給你這樣的需求的?打他

2、如何在編程中使用代理伺服器

用CInternetSession類:
CInternetSession::CInternetSession
CInternetSession(
LPCTSTR pstrAgent = NULL,
DWORD dwContext = 1,
DWORD dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG,
LPCTSTR pstrProxyName = NULL,
LPCTSTR pstrProxyBypass = NULL,
DWORD dwFlags = 0 );
其中:dwAccessType 有幾個有效值:
INTERNET_OPEN_TYPE_PRECONFIG 預配置
INTERNET_OPEN_TYPE_DIRECT 直接訪問internet
INTERNET_OPEN_TYPE_PROXY 通過CERN代理訪問
當用INTERNET_OPEN_TYPE_PRECONFIG時,程序直接從注冊表中讀取proxy設置,這時如果你的IE設置好了代理,你的程序就可以直接連出去了。
當用INTERNET_OPEN_TYPE_PROXY時,程序採用pstrProxyName 指定的設置。

3、關於代理伺服器??

一、什麼是代理伺服器?

代理伺服器英文全稱是Proxy Server,其功能就是代理網路用戶去取得網路信息。形象的說:它是網路信息的中轉站。

在一般情況下,我們使用網路瀏覽器直接去連接其他Internet站點取得網路信息時,需送出Request信號來得到回答,然後對方再把信息以bit方式傳送回來。代理伺服器是介於瀏覽器和Web伺服器之間的一台伺服器,有了它之後,瀏覽器不是直接到Web伺服器去取回網頁而是向代理伺服器發出請求, Request信號會先送到代理伺服器,由代理伺服器來取回瀏覽器所需要的信息並傳送給你的瀏覽器。而且,大部分代理伺服器都具有緩沖的功能,就好象一個大的Cache,它有很大的存儲空間,它不斷將新取得數據儲存到它本機的存儲器上,如果瀏覽器所請求的數據在它本機的存儲器上已經存在而且是最新的,那麼它就不重新從Web伺服器取數據,而直接將存儲器上的數據傳送給用戶的瀏覽器,這樣就能顯著提高瀏覽速度和效率。

更重要的是:Proxy Server (代理伺服器)是 Internet鏈路級網關所提供的一種重要的安全功能,它的工作主要在開放系統互聯 (OSI) 模型的對話層。

二、代理伺服器的分類

1、HTTP代理按匿名功能分類。

是否具有隱藏IP的功能。

非匿名代理:不具有匿名功能。

匿名代理。使用此種代理時,雖然被訪問的網站不能知道你的IP地址,但仍然可以知道你在使用代理,有些偵測IP的網頁也仍然可以查到你的IP。

高度匿名代理:使用此種代理時,被訪問的網站不知道你的IP地址,也不知道你在使用代理進行訪問。此種代理的隱藏IP地址的功能最強。

2、按請求信息的安全性分類

全匿名代理:不改變你的request fields(報文),使伺服器端看來就像有個真正的客戶瀏覽器在訪問它。當然,你的真實IP是隱藏起來的。伺服器的網管不會認為你使用了代理。

普通匿名代理:能隱藏你的真實IP,但會更改你的request fields,有可能會被認為使用了代理,但僅僅是可能,一般說來是沒問題的。不過不要受它的名字的誤導,其安全性可能比全匿名代理更高,有的代理會剝離你的部分信息(就好比防火牆的stealth mode),使伺服器端探測不到你的操作系統版本和瀏覽器版本。

elite代理:匿名隱藏性更高,可隱藏系統及瀏覽器資料信息等。此種代理安全性特強。

透明代理(簡單代理):透明代理的意思是客戶端根本不需要知道有代理伺服器的存在,它改編你的request fields(報文),並會傳送真實IP。注意,加密的透明代理則是屬於匿名代理,意思是不用設置使用代理了,例如Garden 2程序。

3、按代理伺服器的用途分類

1)Http代理:代理客戶機的http訪問,主要代理瀏覽器訪問網頁,它的埠一般為80、8080、3128等。

2)SSL代理:支持最高128位加密強度的http代理,可以作為訪問加密網站的代理。加密網站是指以https://開始的網站。ssl的標准埠為443。

3)HTTP CONNECT代理:允許用戶建立TCP連接到任何埠的代理伺服器,這種代理不僅可用於HTTP,還包括FTP、IRC、RM流服務等。

4)FTP代理:代理客戶機上的ftp軟體訪問ftp伺服器,其埠一般為21、2121。

5)POP3代理:代理客戶機上的郵件軟體用pop3方式收郵件,其埠一般為110。

6)Telnet代理:能夠代理通信機的telnet,用於遠程式控制制,入侵時經常使用。其埠一般為23。

7)Socks代理:是全能代理,就像有很多跳線的轉接板,它只是簡單地將一端的系統連接到另外一端。支持多種協議,包括http、ftp請求及其它類型的請求。它分socks 4 和socks 5兩種類型,socks 4隻支持TCP協議而socks 5支持TCP/UDP協議,還支持各種身份驗證機制等協議。其標准埠為1080。

socks代理相應的採用socks協議的代理伺服器就是SOCKS伺服器,是一種通用的代理伺服器。Socks是個電路級的底層網關,是 DavidKoblas在1990年開發的,此後就一直作為Internet RFC標準的開放標准。Socks不要求應用程序遵循特定的操作系統平台,Socks 代理與應用層代理、 HTTP 層代理不同,Socks代理只是簡單地傳遞數據包,而不必關心是何種應用協議(比如FTP、HTTP和NNTP請求)。所以,Socks代理比其他應用層代理要快得多。它通常綁定在代理伺服器的1080埠上。如果您在企業網或校園網上,需要透過防火牆或通過代理伺服器訪問Internet就可能需要使用 SOCKS。一般情況下,對於撥號上網用戶都不需要使用它。注意,瀏覽網頁時常用的代理伺服器通常是專門的http代理,它和SOCKS是不同的。因此,您能瀏覽網頁不等於您一定可以通過SOCKS訪問Internet。常用的防火牆,或代理軟體都支持SOCKS,但需要其管理員打開這一功能。如果您不確信您是否需要SOCKS或是否有SOCKS可用,請與您的網路管理員聯系。為了使用socks,您需要了解一下內容:

① SOCKS伺服器的IP地址

② SOCKS服務所在的埠

③ 這個SOCKS服務是否需要用戶認證?如果需要,您要向您的網路管理員申請一個用戶和口令

知道了上述信息,您就可以把這些信息填入「網路配置」中,或者在第一次登記時填入,您就可以使用socks代理了。

在實際應用中SOCKS代理可以用作為:電子郵件、新聞組軟體、網路傳呼ICQ、網路聊天MIRC和使用代理伺服器上聯眾打游戲等等各種游戲應用軟體當中。

8)TUNNEL代理:經HTTPTunnet程序轉換的數據包封裝成http請求(Request)來穿透防火牆,允許利用HTTP伺服器做任何TCP可以做的事情,功能相當於Socks5。

9)文獻代理:可以用來查詢資料庫的代理,通過這些代理,可以獲得互聯網的相關科研學術的資料庫資源,例如查詢Sciencedirect網站(簡稱SD)、Academic Press、IEEE,SPRINGER等資料庫。

10)教育網代理:指學術教育機構區域網通過特定的代理伺服器可使無出國許可權或無訪問某IP段許可權的計算機訪問相關資源。

11)跳板代理:應用於跳板程序,可以看作一種具有動態加密的特殊socks5代理,,也可直接用於PSD軟體。其埠一般為1813。

12)Ssso代理:代理客戶機上的ssso程序訪問遠程網站,具有SSL加密強度的超級代理,支持socks。

13)Flat代理:代理客戶機上的flatsurfer程序訪問遠程網站,具有高強度加密數據流的特殊代理,支持socks,最大可設置三次級聯,可以設置穿越代理。其埠一般為6700。

14)SoftE代理:代理客戶機上的SoftEther程序訪問遠程網站,應用虛擬集線器HUB和虛擬網卡技術,具備VPN功能及多種認證方式的代理,符合https協議。

三、代理伺服器的主要功能

代理伺服器一般來講,對於普通的網民的作用有以下幾個(撇開一些高深的用處不談,因為未必會用到):

1、連接Internet與Intranet 充當firewall(防火牆):因為所有內部網的用戶通過代理伺服器訪問外界時,只映射為一個IP地址,所以外界不能直接訪問到內部網;同時可以設置 IP地址過濾,限制內部網對外部的訪問許可權;另外,兩個沒有互聯的內部網,也可以通過第三方的代理伺服器進行互聯來交換信息。

2、節省IP開銷:如前面所講,所有用戶對外只佔用一個IP,所以不必租用過多的IP地址,降低網路的維護成本。這樣,局域局內沒有與外網相連的眾多機器就可以通過內網的一台代理伺服器連接到外網,大大減少費用。當然也有它不利的一面,如許多網路黑客通過這種方法隱藏自己的真實IP地址,而逃過監視。

3、通過它來加快我們瀏覽某些網站的速度:有時候我們訪問一些國外或者港台網站,速度慢得像蝸牛一樣,但只要你正確的選用代理伺服器,速度就可以得到提升,有時候這些速度的提升可是很明顯的哦!本身帶寬較小,通過帶寬較大的proxy與目標主機連接。而且通常代理伺服器都設置一個較大的硬碟緩沖區(可能高達幾個GB或更大),當有外界的信息通過時,同時也將其保存到緩沖區中,當其他用戶再訪問相同的信息時,則直接由緩沖區中取出信息,傳給用戶,從而達到提高訪問速度的目的。

4、通過它,我們可以訪問到一些平時不能去的網站:不信你可以馬上打開你的瀏覽器和輸入「www.geocities.com」這個網址。怎樣?不用看著瀏覽器在這里空等了,並不是你的網路速度慢,也不是沒有這個網站,而是你訪問不到它(網路上還有很多這些類型的網站)。為什麼訪問不到?這個問題嘛......說法有很多種,大部分都說是國內的網路被限制了訪問,所以某些網站是不能去的。如果你在以往瀏覽過程中出現過以上的情況,那麼看來你有必要嘗試一下使用代理伺服器了。

4、C++實現http簡易代理伺服器

我正在做與你同樣的工作,我選擇了mongoose,一款開源的http伺服器。
http://code.google.com/p/mongoose/
這是它的網站,可以內下載源碼,並且協議非常自由。容

有不明白之處可以聯系我。我正在基於mongoose進行開發。

=========================================
源碼在這里可以下載到,http://code.google.com/p/mongoose/downloads/list
我也只是一個c程序員,不太會網路編程。但用mongoose的確非常簡單,因為就是c++寫的,你應該看起來不費勁。

5、java HTTP代理伺服器開發 求助帖

說實話,你的問題很那個。。
不過應該也能實現。
現在問題主要是由於b不能訪問c,所以c只能使用TimerTask定時去訪問b。
b有2個listener,一個負責偵聽來自a的請求,一個負責偵聽來自b的。

b中應該會使用到多線程。
下面定義a的Request為x,c的Request為y
由於b會有多個來自a轉發的請求,可能會有x1\x2\x3等很多並發的請求,所以b在初始化的時候就需要建立一個等待池.
等待池應該是單例且線程同步的,x一來就new object(request,response),然後放入list。
c的定時器一到,就訪問b開放給c的listener,request y。y首先遍歷等待池,取出x的request,然後用取出x的response的返回給a。直到等待池為空為止,然後y response給c。

不過要注意的是
1)你會發現,由於c給b的數據應該是放到request y裡面作為參數來傳的。
2)a的請求如果需要c不同數據介面的數據,那c-->b的request y里就應該包含所有的數據,然後在遍歷等待池的時候根據a-->b的request x的id(可以使用sessionid)來區分取哪個。
3)最差的情況,
1,a源源不斷的發出x請求,c的request遍歷就死循環。
2,如果c的定時時間太短,y1還沒完,y2就來了。
3,a源源不斷的發出x請求,但是某一請求Xn就無法搶到資源,Xn就掛掉。

這裡面很多處理你還要多加控制。

這個想法沒實驗過,其實如果b可以訪問c,其實什麼問題都沒有了
最後問一句,誰給你這樣的需求的?打他

6、C#軟體編程如何實現代理伺服器?

如果你有C++的編程背景,那這個問題就很簡單了:C#中的delegate和C++中的函數指針基本是一回事,C#正是以delegate的形式實現了函數指針。不同的地方在於C#中delegate是類型安全的。
如果沒有C或者C++的背景知識也沒有一點關系。
要理解Delegate,首先,你要明白,它是一個類,他和Class是一個級別的概念,不同在於Class的定義包含欄位和方法,而delegate只包含方法的細節。
定義Delegate:
public delegate bool CompareDelegate(int a, int b);

上面語句的含義是:定義了一個委託的實例時,這些實例都要包含一個方法名,並且這個方法必須有兩個int型的參數,並且必須返回一個bool型的值。
好,現在就創建一個上面定義的委託的實例
public CompareDelegate myCompare = new CompareDelegate(CompareMethod);
裡面的這個CompareMethod是一個方法:
定義如下:
public static bool CompareMethod(int x , int y)
{
bool result = x > y ? true : false;
return result;
}
怎麼使用呢
int a = 10;
int b = 15;
bool isBigger = myDelegate(a, b);

下面是完整的代碼:
using System;
using System.Collections.Generic;
using System.Text;
using Common;

namespace ConsoleApplication8
{
//定義委託
public delegate bool CompareDelegate(int a, int b);
public class MyCompare
{
/// <summary>
/// 定義一個方法,符合上面定義的委託所要求的方法細節,返回值為bool型,兩個參數分別為int型
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public static bool CompareMethod(int x , int y)
{
bool result = x > y ? true : false;
return result;
}

}
class Program
{

static void Main(string[] args)
{
//實例化委託並初始化。注意初始化時候,必須包含一個方法的名稱,而且這個方法必須符合最初定義委託時候的簽名(參數類型和返回值)
CompareDelegate myDelegate = new CompareDelegate(MyCompare.CompareMethod);
//現在我們使用委託實例來比較兩個數a和b的的大小
int a = 10;
int b = 15;
bool isBigger = myDelegate(a, b);
Console.WriteLine(" a > b ?: " + isBigger);
Console.Read();
}
}
}

是不是太簡單了。

C#中委託用來干什麼呢,當然不是用來實現象上面那樣的弱智程序。在C#中一提委託,一般就會引出另外一個術語:事件。C#中事件的實現,正是依賴於delegate。而事件又是一個很重要的概念,只有真正理解了委託,才能打好基礎,真正的弄明白事件。
希望有幫助

7、如何用代理伺服器?

第一步、點「選項」——>「代理伺服器」——>「代理設置」 。

第二步、在出現的對話框中點擊右上角的「+」添加新的代理伺服器 。

第三步、在彈出的對話框中填寫代理伺服器。

第四步、點「選項」——>「代理伺服器」——>單擊你想使用的代理即可。

8、什麼是代理伺服器?它是干什麼用的??

代理伺服器英文全稱是Proxy Server,其功能就是代理網路用戶去取得網路信息。形象的說:它是網路信息的中轉站。在一般情況下,我們使用網路瀏覽器直接去連接其他Internet站點取得網路信息時,須送出Request信號來得到回答,然後對方再把信息以bit方式傳送回來。代理伺服器是介於瀏覽器和Web伺服器之間的一台伺服器,有了它之後,瀏覽器不是直接到Web伺服器去取回網頁而是向代理伺服器發出請求,Request信號會先送到代理伺服器,由代理伺服器來取回瀏覽器所需要的信息並傳送給你的瀏覽器。而且,大部分代理伺服器都具有緩沖的功能,就好象一個大的Cache,它有很大的存儲空間,它不斷將新取得數據儲存到它本機的存儲器上,如果瀏覽器所請求的數據在它本機的存儲器上已經存在而且是最新的,那麼它就不重新從Web伺服器取數據,而直接將存儲器上的數據傳送給用戶的瀏覽器,這樣就能顯著提高瀏覽速度和效率。更重要的是:Proxy Server(代理伺服器)是Internet鏈路級網關所提供的一種重要的安全功能,它的工作主要在開放系統互聯(OSI)模型的對話層。主要的功能有:
1.突破自身IP訪問限制,訪問國外站點。教育網、169網等網路用戶可以通過代理訪問國外網站。
2.訪問一些單位或團體內部資源,如某大學FTP(前提是該代理地址在該資源 的允許訪問范圍之內),使用教育網內地址段免費代理伺服器,就可以用於對教育 網開放的各類FTP下載上傳,以及各類資料查詢共享等服務。
3.突破中國電信的IP封鎖:中國電信用戶有很多網站是被限制訪問的,這種 限制是人為的,不同Serve對地址的封鎖是不同的。所以不能訪問時可以換一個國 外的代理伺服器試試。
4.提高訪問速度:通常代理伺服器都設置一個較大的硬碟緩沖區,當有外界 的信息通過時,同時也將其保存到緩沖區中,當其他用戶再訪問相同的信息時, 則直接由緩沖區中取出信息,傳給用戶,以提高訪問速度。
5.隱藏真實IP:上網者也可以通過這種方法隱藏自己的IP,免受攻擊。

1.IE5.0以上版本中設置代理:菜單欄「工具」->下拉菜單「Internet選項」->選項卡「連接」->在「區域網設置」中選中您目前 使用的連接,然後點擊右側的「設置」->在中間的「代理伺服器」欄選中「使用代理伺服器」->在「地址」 和「埠」欄輸入本站提供的HTTP代理伺服器->確定->確定。
2.MyIE2中設置代理伺服器:菜單欄「選項」——》「代理伺服器」——》「代理設置」——》在輸入框中輸入標准格式的代理伺服器,如XXX.XXX.XXX.XXX:埠,然後「確定」並退出,繼續,菜單欄「選項」——》「代理伺服器」——》然後選擇剛才輸入的代理伺服器
3.騰訊瀏覽器(TT瀏覽器)中設置代理伺服器:菜單欄「工具」——》「WWW代理」——》「設置代理」——》在代理設置對話框中,點擊「新增」——》在代理設置區中,輸入代理,然後「確定」並退出,繼續,菜單欄「工具」——》「WWW代理」——》然後選擇剛才輸入的代理伺服器

9、什麼是代理伺服器,如何使用代理伺服器

一、什麼是代理伺服器?

代理伺服器英文全稱是Proxy Server,其功能就是代理網路用戶去取得網路信息。形象的說:它是網路信息的中轉站。

在一般情況下,我們使用網路瀏覽器直接去連接其他Internet站點取得網路信息時,需送出Request信號來得到回答,然後對方再把信息以bit方式傳送回來。代理伺服器是介於瀏覽器和Web伺服器之間的一台伺服器,有了它之後,瀏覽器不是直接到Web伺服器去取回網頁而是向代理伺服器發出請求, Request信號會先送到代理伺服器,由代理伺服器來取回瀏覽器所需要的信息並傳送給你的瀏覽器。而且,大部分代理伺服器都具有緩沖的功能,就好象一個大的Cache,它有很大的存儲空間,它不斷將新取得數據儲存到它本機的存儲器上,如果瀏覽器所請求的數據在它本機的存儲器上已經存在而且是最新的,那麼它就不重新從Web伺服器取數據,而直接將存儲器上的數據傳送給用戶的瀏覽器,這樣就能顯著提高瀏覽速度和效率。

更重要的是:Proxy Server (代理伺服器)是 Internet鏈路級網關所提供的一種重要的安全功能,它的工作主要在開放系統互聯 (OSI) 模型的對話層。

二、代理伺服器的分類

1、HTTP代理按匿名功能分類。

是否具有隱藏IP的功能。

非匿名代理:不具有匿名功能。

匿名代理。使用此種代理時,雖然被訪問的網站不能知道你的IP地址,但仍然可以知道你在使用代理,有些偵測IP的網頁也仍然可以查到你的IP。

高度匿名代理:使用此種代理時,被訪問的網站不知道你的IP地址,也不知道你在使用代理進行訪問。此種代理的隱藏IP地址的功能最強。

2、按請求信息的安全性分類

全匿名代理:不改變你的request fields(報文),使伺服器端看來就像有個真正的客戶瀏覽器在訪問它。當然,你的真實IP是隱藏起來的。伺服器的網管不會認為你使用了代理。

普通匿名代理:能隱藏你的真實IP,但會更改你的request fields,有可能會被認為使用了代理,但僅僅是可能,一般說來是沒問題的。不過不要受它的名字的誤導,其安全性可能比全匿名代理更高,有的代理會剝離你的部分信息(就好比防火牆的stealth mode),使伺服器端探測不到你的操作系統版本和瀏覽器版本。

elite代理:匿名隱藏性更高,可隱藏系統及瀏覽器資料信息等。此種代理安全性特強。

透明代理(簡單代理):透明代理的意思是客戶端根本不需要知道有代理伺服器的存在,它改編你的request fields(報文),並會傳送真實IP。注意,加密的透明代理則是屬於匿名代理,意思是不用設置使用代理了,例如Garden 2程序。

3、按代理伺服器的用途分類

1)Http代理:代理客戶機的http訪問,主要代理瀏覽器訪問網頁,它的埠一般為80、8080、3128等。

2)SSL代理:支持最高128位加密強度的http代理,可以作為訪問加密網站的代理。加密網站是指以https://開始的網站。ssl的標准埠為443。

3)HTTP CONNECT代理:允許用戶建立TCP連接到任何埠的代理伺服器,這種代理不僅可用於HTTP,還包括FTP、IRC、RM流服務等。

4)FTP代理:代理客戶機上的ftp軟體訪問ftp伺服器,其埠一般為21、2121。

5)POP3代理:代理客戶機上的郵件軟體用pop3方式收郵件,其埠一般為110。

6)Telnet代理:能夠代理通信機的telnet,用於遠程式控制制,入侵時經常使用。其埠一般為23。

7)Socks代理:是全能代理,就像有很多跳線的轉接板,它只是簡單地將一端的系統連接到另外一端。支持多種協議,包括http、ftp請求及其它類型的請求。它分socks 4 和socks 5兩種類型,socks 4隻支持TCP協議而socks 5支持TCP/UDP協議,還支持各種身份驗證機制等協議。其標准埠為1080。

socks代理相應的採用socks協議的代理伺服器就是SOCKS伺服器,是一種通用的代理伺服器。Socks是個電路級的底層網關,是 DavidKoblas在1990年開發的,此後就一直作為Internet RFC標準的開放標准。Socks不要求應用程序遵循特定的操作系統平台,Socks 代理與應用層代理、 HTTP 層代理不同,Socks代理只是簡單地傳遞數據包,而不必關心是何種應用協議(比如FTP、HTTP和NNTP請求)。所以,Socks代理比其他應用層代理要快得多。它通常綁定在代理伺服器的1080埠上。如果您在企業網或校園網上,需要透過防火牆或通過代理伺服器訪問Internet就可能需要使用 SOCKS。一般情況下,對於撥號上網用戶都不需要使用它。注意,瀏覽網頁時常用的代理伺服器通常是專門的http代理,它和SOCKS是不同的。因此,您能瀏覽網頁不等於您一定可以通過SOCKS訪問Internet。常用的防火牆,或代理軟體都支持SOCKS,但需要其管理員打開這一功能。如果您不確信您是否需要SOCKS或是否有SOCKS可用,請與您的網路管理員聯系。為了使用socks,您需要了解一下內容:

① SOCKS伺服器的IP地址

② SOCKS服務所在的埠

③ 這個SOCKS服務是否需要用戶認證?如果需要,您要向您的網路管理員申請一個用戶和口令

知道了上述信息,您就可以把這些信息填入「網路配置」中,或者在第一次登記時填入,您就可以使用socks代理了。

在實際應用中SOCKS代理可以用作為:電子郵件、新聞組軟體、網路傳呼ICQ、網路聊天MIRC和使用代理伺服器上聯眾打游戲等等各種游戲應用軟體當中。

8)TUNNEL代理:經HTTPTunnet程序轉換的數據包封裝成http請求(Request)來穿透防火牆,允許利用HTTP伺服器做任何TCP可以做的事情,功能相當於Socks5。

9)文獻代理:可以用來查詢資料庫的代理,通過這些代理,可以獲得互聯網的相關科研學術的資料庫資源,例如查詢Sciencedirect網站(簡稱SD)、Academic Press、IEEE,SPRINGER等資料庫。

10)教育網代理:指學術教育機構區域網通過特定的代理伺服器可使無出國許可權或無訪問某IP段許可權的計算機訪問相關資源。

11)跳板代理:應用於跳板程序,可以看作一種具有動態加密的特殊socks5代理,,也可直接用於PSD軟體。其埠一般為1813。

12)Ssso代理:代理客戶機上的ssso程序訪問遠程網站,具有SSL加密強度的超級代理,支持socks。

13)Flat代理:代理客戶機上的flatsurfer程序訪問遠程網站,具有高強度加密數據流的特殊代理,支持socks,最大可設置三次級聯,可以設置穿越代理。其埠一般為6700。

14)SoftE代理:代理客戶機上的SoftEther程序訪問遠程網站,應用虛擬集線器HUB和虛擬網卡技術,具備VPN功能及多種認證方式的代理,符合https協議。

三、代理伺服器的主要功能

代理伺服器一般來講,對於普通的網民的作用有以下幾個(撇開一些高深的用處不談,因為未必會用到):

1、連接Internet與Intranet 充當firewall(防火牆):因為所有內部網的用戶通過代理伺服器訪問外界時,只映射為一個IP地址,所以外界不能直接訪問到內部網;同時可以設置 IP地址過濾,限制內部網對外部的訪問許可權;另外,兩個沒有互聯的內部網,也可以通過第三方的代理伺服器進行互聯來交換信息。

2、節省IP開銷:如前面所講,所有用戶對外只佔用一個IP,所以不必租用過多的IP地址,降低網路的維護成本。這樣,局域局內沒有與外網相連的眾多機器就可以通過內網的一台代理伺服器連接到外網,大大減少費用。當然也有它不利的一面,如許多網路黑客通過這種方法隱藏自己的真實IP地址,而逃過監視。

3、通過它來加快我們瀏覽某些網站的速度:有時候我們訪問一些國外或者港台網站,速度慢得像蝸牛一樣,但只要你正確的選用代理伺服器,速度就可以得到提升,有時候這些速度的提升可是很明顯的哦!本身帶寬較小,通過帶寬較大的proxy與目標主機連接。而且通常代理伺服器都設置一個較大的硬碟緩沖區(可能高達幾個GB或更大),當有外界的信息通過時,同時也將其保存到緩沖區中,當其他用戶再訪問相同的信息時,則直接由緩沖區中取出信息,傳給用戶,從而達到提高訪問速度的目的。

4、通過它,我們可以訪問到一些平時不能去的網站:不信你可以馬上打開你的瀏覽器和輸入「www.geocities.com」這個網址。怎樣?不用看著瀏覽器在這里空等了,並不是你的網路速度慢,也不是沒有這個網站,而是你訪問不到它(網路上還有很多這些類型的網站)。為什麼訪問不到?這個問題嘛......說法有很多種,大部分都說是國內的網路被限制了訪問,所以某些網站是不能去的。如果你在以往瀏覽過程中出現過以上的情況,那麼看來你有必要嘗試一下使用代理伺服器了。至於如何可以訪問到這些網站? 請您繼續閱讀本系列文章!

10、想編寫一個簡單的代理伺服器

代理伺服器的應用非常廣泛。比如,在企業網內部,它可以用來控制員工在工作時瀏覽的Internet內容,阻止員工訪問某些類型的內容或某些指定的網站。代理伺服器實際上扮演著瀏覽器和Web伺服器之間的中間人的角色,能夠對瀏覽器請求進行各種各樣的處理,能夠過濾廣告和Cookie,能夠預先提取Web頁面,使得瀏覽器訪問頁面的速度更快,等等。

一、基礎知識

不管以哪種方式應用代理伺服器,其監控HTTP傳輸的過程總是如下:

步驟一:內部的瀏覽器發送請求給代理伺服器。請求的第一行包含了目標URL。 

步驟二:代理伺服器讀取該URL,並把請求轉發給合適的目標伺服器。 

步驟三:代理伺服器接收來自Internet目標機器的應答,把應答轉發給合適的內部瀏覽器。 

 

例如,假設有一個企業的雇員試圖訪問www.cn.ibm.com網站。如果沒有代理伺服器,雇員的瀏覽器打開的Socket通向運行這個網站的Web伺服器,從Web伺服器返回的數據也直接傳遞給雇員的瀏覽器。如果瀏覽器被配置成使用代理伺服器,則請求首先到達代理伺服器;隨後,代理伺服器從請求的第一行提取目標URL,打開一個通向www.cn.ibm.com的Socket。當www.cn.ibm.com返回應答時,代理伺服器把應答轉發給雇員的瀏覽器。

當然,代理伺服器並非只適用於企業環境。作為一個開發者,擁有一個自己的代理伺服器是一件很不錯的事情。例如,我們可以用代理伺服器來分析瀏覽器和Web伺服器的交互過程。測試和解決Web應用中存在的問題時,這種功能是很有用的。我們甚至還可以同時使用多個代理伺服器(大多數代理伺服器允許多個伺服器鏈接在一起使用)。例如,我們可以有一個企業的代理伺服器,再加上一個用java編寫的代理伺服器,用來調試應用程序。但應該注意的是,代理伺服器鏈上的每一個伺服器都會對性能產生一定的影響。

二、設計規劃

正如其名字所示,代理伺服器只不過是一種特殊的伺服器。和大多數伺服器一樣,如果要處理多個請求,代理伺服器應該使用線程。下面是一個代理伺服器的基本規劃:

等待來自客戶(Web瀏覽器)的請求。 

啟動一個新的線程,以處理客戶連接請求。 

讀取瀏覽器請求的第一行(該行內容包含了請求的目標URL)。 

分析請求的第一行內容,得到目標伺服器的名字和埠。 

打開一個通向目標伺服器(或下一個代理伺服器,如合適的話)的Socket。 

把請求的第一行發送到輸出Socket。 

把請求的剩餘部分發送到輸出Socket。 

把目標Web伺服器返回的數據發送給發出請求的瀏覽器。 

 

當然,如果考慮細節的話,情況會更復雜一些。實際上,這里主要有兩個問題要考慮:第一,從Socket按行讀取數據最適合進一步處理,但這會產生性能瓶頸;第二,兩個Socket之間的連接必需高效。有幾種方法可以實現這兩個目標,但每一種方法都有各自的代價。例如,如果要在數據進入的時候進行過濾,這些數據最好按行讀取;然而,大多數時候,當數據到達代理伺服器時,立即把它轉發出去更適合高效這一要求。另外,數據的發送和接收也可以使用多個獨立的線程,但大量地創建和拆除線程也會帶來性能問題。因此,對於每一個請求,我們將用一個線程處理數據的接收和發送,同時在數據到達代理伺服器時,盡可能快速地把它轉發出去。

三、實例

在用java編寫這個代理伺服器的過程中,注意可重用性是很重要的。因為這樣的話,當我們想要在另一個工程中以不同的方式處理瀏覽器請求時,可以方便地重用該代理伺服器。當然,我們必須注意靈活性和效率之間的平衡。

圖一顯示了本文代理伺服器實例(HttpProxy.java)的輸出界面,當瀏覽器訪問http://www-900.ibm.com/cn/時,代理伺服器向默認日誌設備(即標准輸出設備屏幕)輸出瀏覽器請求的URL。圖二顯示了SubHttpProxy的輸出。SubHttpProxy是HttpProxy的一個簡單擴展。

圖一

 

圖二

 

為了構造代理伺服器,我從Thread基類派生出了HttpProxy類(文章正文中出現的代碼是該類的一些片斷,完整的代碼請從本文最後下載)。HttpProxy類包含了一些用來定製代理伺服器行為的屬性,參見Listing 1和表一。

【Listing 1】

/*************************************

 * 一個基礎的代理伺服器類

 *************************************

 */

import java.net.*;

import java.io.*;

public class HttpProxy extends Thread {

    static public int CONNECT_RETRIES=5;

    static public int CONNECT_PAUSE=5;

    static public int TIME-OUT=50;

    static public int BUFSIZ=1024;

    static public boolean logging = false;

    static public OutputStream log=null;

    // 傳入數據用的Socket

    protected Socket socket;

    // 上級代理伺服器,可選

    static private String parent=null;

    static private int parentPort=-1;

    static public void setParentProxy(String name, int pport) {

        parent=name;

        parentPort=pport;

    }

    // 在給定Socket上創建一個代理線程。

    public HttpProxy(Socket s) { socket=s; start(); }

    public void writeLog(int c, boolean browser) throws IOException {

        log.write(c);

    }

    public void writeLog(byte[] bytes,int offset,

             int len, boolean browser) throws IOException {

        for (int i=0;i<len;i++) writeLog((int)bytes[offset+i],browser);

    }

    // 默認情況下,日誌信息輸出到

    // 標准輸出設備,

    // 派生類可以覆蓋它

    public String processHostName(String url, String host, int port, Socket sock) {

        java.text.DateFormat cal=java.text.DateFormat.getDateTimeInstance();

        System.out.println(cal.format(new java.util.Date()) + " - " +

              url + " " + sock.getInetAddress()+"<BR>");

        return host;

    }

 

 

表一 

變數/方法 說明 

CONNECT_RETRIES 在放棄之前嘗試連接遠程主機的次數。 

CONNECT_PAUSE 在兩次連接嘗試之間的暫停時間。 

TIME-OUT 等待Socket輸入的等待時間。 

BUFSIZ Socket輸入的緩沖大小。 

logging 是否要求代理伺服器在日誌中記錄所有已傳輸的數據(true表示「是」)。 

log 一個OutputStream對象,默認日誌常式將向該OutputStream對象輸出日誌信息。 

setParentProxy 用來把一個代理伺服器鏈接到另一個代理伺服器(需要指定另一個伺服器的名稱和埠)。 

 

當代理伺服器連接到Web伺服器之後,我用一個簡單的循環在兩個Socket之間傳遞數據。這里可能出現一個問題,即如果沒有可操作的數據,調用read方法可能導致程序阻塞,從而掛起程序。為防止出現這個問題,我用setSoTimeout方法設置了Socket的超時時間(參見Listing 2)。這樣,如果某個Socket不可用,另一個仍舊有機會進行處理,我不必創建一個新的線程。

【Listing 2】

    // 執行操作的線程

    public void run() {

    String line;

    String host;

    int port=80;

        Socket outbound=null;

    try {

        socket.setSoTimeout(TIMEOUT);

        InputStream is=socket.getInputStream();

        OutputStream os=null;

        try {

        // 獲取請求行的內容

        line="";

        host="";

        int state=0;

        boolean space;

        while (true) {

            int c=is.read();

            if (c==-1) break;

            if (logging) writeLog(c,true);

            space=Character.isWhitespace((char)c); 

            switch (state) {

            case 0:

            if (space) continue; 

                state=1;

            case 1:

            if (space) {

                state=2;

                continue;

            }

            line=line+(char)c;

            break;

            case 2:

            if (space) continue; // 跳過多個空白字元

                  state=3;

            case 3:

            if (space) {

                state=4;

               // 只分析主機名稱部分

                String host0=host;

                int n;

                n=host.indexOf("//");

                if (n!=-1) host=host.substring(n+2);

                n=host.indexOf('/');

                if (n!=-1) host=host.substring(0,n);

                // 分析可能存在的埠號

                n=host.indexOf(":");

                if (n!=-1) { 

                port=Integer.parseInt(host.substring(n+1));

                host=host.substring(0,n);

                }

                host=processHostName(host0,host,port,socket);

                if (parent!=null) {

                host=parent;

                port=parentPort;

                }

                int retry=CONNECT_RETRIES;

                while (retry--!=0) {

                try {

                    outbound=new Socket(host,port);

                    break;

                } catch (Exception e) { }

                // 等待

                Thread.sleep(CONNECT_PAUSE);

                }

                if (outbound==null) break;

                outbound.setSoTimeout(TIMEOUT);

                os=outbound.getOutputStream();

                os.write(line.getBytes());

                os.write(' ');

                os.write(host0.getBytes());

                os.write(' ');

                pipe(is,outbound.getInputStream(),os,socket.getOutputStream());

                break;

            }

            host=host+(char)c;

            break;

            }

        }

        }

        catch (IOException e) { }

    } catch (Exception e) { }

    finally {

            try { socket.close();} catch (Exception e1) {}

            try { outbound.close();} catch (Exception e2) {}

       }

    }

 

 

和所有線程對象一樣,HttpProxy類的主要工作在run方法內完成(見Listing 2)。run方法實現了一個簡單的狀態機,從Web瀏覽器每次一個讀取字元,持續這個過程直至有足夠的信息找出目標Web伺服器。然後,run打開一個通向該Web伺服器的Socket(如果有多個代理伺服器被鏈接在一起,則run方法打開一個通向鏈裡面下一個代理伺服器的Socket)。打開Socket之後,run先把部分的請求寫入Socket,然後調用pipe方法。pipe方法直接在兩個Socket之間以最快的速度執行讀寫操作。

如果數據規模很大,另外創建一個線程可能具有更高的效率;然而,當數據規模較小時,創建新線程所需要的開銷會抵消它帶來的好處。

Listing 3顯示了一個很簡單的main方法,可以用來測試HttpProxy類。大部分的工作由一個靜態的startProxy方法完成(見Listing 4)。這個方法用到了一種特殊的技術,允許一個靜態成員創建HttpProxy類(或HttpProxy類的子類)的實例。它的基本思想是:把一個Class對象傳遞給startProxy類;然後,startProxy方法利用映像API(Reflection API)和getDeclaredConstructor方法確定該Class對象的哪一個構造函數接受一個Socket參數;最後,startProxy方法調用newInstance方法創建該Class對象。

【Listing 3】

// 測試用的簡單main方法

static public void main(String args[]) {

    System.out.println("在埠808啟動代理伺服器 ");

    HttpProxy.log=System.out;

    HttpProxy.logging=false;

    HttpProxy.startProxy(808,HttpProxy.class);

  }

}

 

 

【Listing 4】

static public void startProxy(int port,Class clobj) {

  ServerSocket ssock;

  Socket sock;

  try {

      ssock=new ServerSocket(port);

      while (true) {

          Class [] sarg = new Class[1];

          Object [] arg= new Object[1];

          sarg[0]=Socket.class;

          try {

              java.lang.reflect.Constructor cons = clobj.getDeclaredConstructor(sarg);

              arg[0]=ssock.accept();

              cons.newInstance(arg); // 創建HttpProxy或其派生類的實例

          } catch (Exception e) { 

              Socket esock = (Socket)arg[0];

              try { esock.close(); } catch (Exception ec) {}

          }

      }

  } catch (IOException e) {

  }

}

 

 

利用這種技術,我們可以在不創建startProxy方法定製版本的情況下,擴展HttpProxy類。要得到給定類的Class對象,只需在正常的名字後面加上.class(如果有某個對象的一個實例,則代之以調用getClass方法)。由於我們把Class對象傳遞給了startProxy方法,所以創建HttpProxy的派生類時,就不必再特意去修改startProxy。(下載代碼中包含了一個派生得到的簡單代理伺服器)。

結束語

利用派生類定製或調整代理伺服器的行為有兩種途徑:修改主機的名字,或者捕獲所有通過代理伺服器的數據。processHostName方法允許代理伺服器分析和修改主機名字。如果啟用了日誌記錄,代理伺服器為每一個通過伺服器的字元調用writeLog方法。如何處理這些信息完全由我們自己決定——可以把它寫入日誌文件,可以把它輸出到控制台,或進行任何其他滿足我們要求的處理。writeLog輸出中的一個Boolean標記指示出數據是來自瀏覽器還是Web主機。

和許多工具一樣,代理伺服器本身並不存在好或者壞的問題,關鍵在於如何使用它們。代理伺服器可能被用於侵犯隱私,但也可以阻隔偷窺者和保護網路。即使代理伺服器和瀏覽器不在同一台機器上,我也樂意把代理伺服器看成是一種擴展瀏覽器功能的途徑。例如,在把數據發送給瀏覽器之前,可以用代理伺服器壓縮數據;未來的代理伺服器甚至還可能把頁面從一種語言翻譯成另一種語言……可能性永無止境。

與代理伺服器開發相關的知識