IdFTP。通过代理服务器连接

时间:2016-05-16 11:19:06

标签: delphi ftp delphi-xe indy

我们的Delphi应用程序正在尝试使用代理服务器在客户端计算机上通过IdFTP连接到我们的网站,并且我总是得到一个超时读取时间。信息。我不知道如何解决它。

我的代码:

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组件,必须在uses子句中使用什么?德尔福没有意识到这一点。

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请求不同的Web地址。换句话说,它们都通过相同的代理服务器,但目标地址不同。以防这是有用的。

我现在尝试使用Fiddler找到问题,不确定这是不是一个好主意?我的理解是,Fiddler充当代理服务器,所以我想我会看到我是否遇到了同样的问题。果然,无法连接。

要清楚我的步骤:

运行Fiddler,然后选中“捕获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从本地计算机上镜像问题。如果我不使用Fiddler,一切都很好。如果我如上所述使用Fiddler,那么HTTP请求可以正常工作,但FTP请求无法连接。

关于我可以做些什么来尝试解决这个问题的任何想法?我确定我做错了是非常愚蠢的事。

1 个答案:

答案 0 :(得分:1)

IdFTP1.ProxySettings.ProxyType:=fpcmNone

这会告诉TIdFTP 与支持FTP的代理进行通信。如果您要使用TIdFTP.ProxySettings属性,则需要设置ProxyType,以便TIdFTP.Connect()将连接到ProxySettings.HostTIdFTP.Login()将知道哪种命令它需要发送到登录代理并请求连接到下一个主机。

请注意,TIdFTP.ProxySettings仅适用于FTP代理。如果您需要连接到其他类型的代理,在致电TIdFTP.Connect()之前,您必须将TIdIOHandler派生的组件分配给TIdFTP.IOHandler属性,然后分配{{1 - TIdCustomTransparentProxy属性的派生组件。要连接到HTTP代理(它听起来像你需要,因为这是TIdIOHandler.TransparentProxy使用的),请使用TIdHTTP.ProxyParams。要连接到SOCKS代理,请使用TIdConnectThroughHttpProxy