2016-05-16 116 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

相关问题