2016-05-16 115 views
1

我們的Delphi應用程序試圖通過客戶端計算機上的IdFTP使用代理服務器連接到我們的網站,並且我總是收到「讀取超時」消息。我不知道如何解決它。通過代理服務器的IdFTP.Connect

我的代碼:

IdFTP1.Host  :=Website_address; 
IdFTP1.Username :=Website_user; 
IdFTP1.Password :=Website_password; 
IdFTP1.TransferType:=ftBinary; 

IdFTP1.ProxySettings.ProxyType:=fpcmNone; 
IdFTP1.ProxySettings.Host  :=Proxy_server; 
IdFTP1.ProxySettings.Port  :=Proxy_port; 
IdFTP1.ProxySettings.Username :=Proxy_username; 
IdFTP1.ProxySettings.Password :=Proxy_password; 

IdFTP1.Connect; 

...它返回一個 '讀超時' 異常。

在網絡上尋找可能的解決方案之後,我嘗試了以下各種各樣的組合,但沒有喜悅(儘管可能有組合可能有效,但我不知道自己在做什麼):

IdFTP1.IOHandler    :=TIdSSLIOHandlerSocketOpenSSL.Create 
                (IdFTP1); 
IdFTP1.UseTLS     :=utUseExplicitTLS; 
IdFTP1.NATKeepAlive.UseKeepAlive:=True; 
IdFTP1.NATKeepAlive.IdleTimeMS :=100000; 
IdFTP1.DataPortProtection  :=ftpdpsPrivate; 

令人沮喪的是我無法在我的機器上測試它,我必須編譯新版本的應用程序,將它複製到他們的機器,然後看它是否工作。

就我所知,在客戶端安裝沒有任何複雜的東西。他們給了我代理主機地址,並且代理用戶名和密碼爲空。

該應用程序的其他位通過HTTP和代理服務器連接到同一個網站,這完美地工作。所以我的邏輯是,它不能是防火牆或類似的東西。

IdHTTP1.HandleRedirects    :=True; 
IdHTTP1.ProxyParams.BasicAuthentication:=True;                        
IdHTTP1.ProxyParams.ProxyServer  :=Proxy_server; 
IdHTTP1.ProxyParams.ProxyPort   :=Proxy_port;     
IdHTTP1.ProxyParams.ProxyUsername  :=Proxy_username; 
IdHTTP1.ProxyParams.ProxyPassword  :=Proxy_password; 

我正在使用Delphi XE8。

他們爲我們的測試創建了一個虛擬服務器,它運行Windows 7 64位。

更新

雷米,這是正確的想法?我遇到的一個問題是TIdConnectThroughHttpProxy組件,在此用法子句中必須包含哪些內容?德爾福沒有認識到它。

var 

TempIO : TIdIOHandlerStack; 
TempProxy : TIdConnectThroughHttpProxy; 

......

TempIO     :=TIdIOHandlerStack.Create; 
TempProxy    :=TIdConnectThroughHttpProxy.Create; 
TempProxy.Host   :=Proxy_host; 
TempIO.TransparentProxy:=TempProxy; 
IdFTP1.IOHandler  :=TempIO; 

IdFTP1.Connect; 

更新2

清晰度的點:已成功通過代理服務器到達Web服務器的HTTP請求進行到不同於FTP請求的網址。換句話說,他們都通過相同的代理服務器,但目標地址是不同的。以防萬一這是有用的。

我現在已經嘗試使用提琴手來找到問題,不知道這是一個好主意嗎?我的理解是,提琴手充當代理服務器,所以我想我會看看我是否遇到同樣的問題。果然,無法連接。

要清楚我的步驟:

運行小提琴手,並檢查說「捕捉FTP請求」複選框。

更新我的IdHTTP組件:

IdHTTP1.ProxyParams.ProxyServer:='127.0.0.1'; 
IdHTTP1.ProxyParams.ProxyPort :=Fiddler port; 

更新我的IdFTP組件:

IdFTP1.ProxySettings.Host:='127.0.0.1'; 
IdFTP1.ProxySettings.Port:=Fiddler port; 

所以,現在我已刪除的客戶端安裝完全,我鏡像使用招從我的本地機器的問題盡我所知。如果我不使用提琴手,一切都很好。如果我如上所述使用Fiddler,那麼HTTP請求將正常工作,但FTP請求無法連接。

任何想法,我可以做些什麼來嘗試解決這個問題?我確信這是一件非常愚蠢的事情,我做錯了。

+0

經過多次試驗和錯誤,結果證明問題出在客戶端。上面第一個'Update'標題下的代碼是正確的,並且在嘗試通過HTTP代理通過FTP進行連接時運行良好。忽略「更新2」下的文本。嘗試使用Fiddler進行測試根本不起作用,我最終使用了CCProxy,這非常有幫助。 @Remy Lebeau再次感謝下面的答案。 – Alex

回答

1
IdFTP1.ProxySettings.ProxyType:=fpcmNone 

這告訴TIdFTP與FTP感知代理進行通信。如果要使用TIdFTP.ProxySettings屬性,則需要設置ProxyType,以便TIdFTP.Connect()將連接到ProxySettings.Host,並且TIdFTP.Login()將知道它需要發送哪些類型的命令以便登錄到代理並請求連接到下一個主機。

請注意,TIdFTP.ProxySettings只適用於FTP代理。如果您需要連接到不同類型的代理服務器,則在致電TIdFTP.Connect()之前,您必須將TIdIOHandler衍生組件分配給TIdFTP.IOHandler屬性,然後將TIdCustomTransparentProxy衍生組件分配給TIdIOHandler.TransparentProxy屬性。要連接到HTTP代理(聽起來像您需要,因爲這是TIdHTTP.ProxyParams的工作原理),請使用TIdConnectThroughHttpProxy。要連接到SOCKS代理,請使用TIdSocksInfo

+0

謝謝@Remy Lebeau。我不太確定如何正確地工作,你能看看我上面更新的代碼,並讓我知道這是否是正確的想法,也是我錯誤的地方? – Alex

+0

是的,這是基本的想法。 'TIdConnectThroughHttpProxy'組件位於'IdConnectThroughHttpProxy'單元中。不要忘記將其Enabled屬性設置爲true。另外,如果你想使用FTP加密,你需要使用SSLIOHandler,比如'TIdSSLIOHandlerSocketOpenSSL'。 –

+0

再次感謝@Remy Lebeau。仍在與此作鬥爭,我嘗試了所建議的選項,迄今爲止都沒有成功。你可以看看更新2,我試圖用不同的角度來解決這個問題,也許你有一些想法? – Alex

相關問題