IDHttp的proxy参数设定的是http代理.
但我现在想使用socks5代理.
用如下代码测试的,但总是会出现错误:unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, IdSocks, IdIOHandler, IdIOHandlerSocket;type
  TForm1 = class(TForm)
    Edit1: TEdit;
    mmoShow: TMemo;
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    idhttp: TIdHTTP;
    sockinfo1: TIdSocksInfo;
    idio1: TIdIOHandlerSocket;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  strGet :String;
begin
   idhttp.HandleRedirects := true;   
  strGet := idhttp.Get('http://www.ip138.com/ip2city.asp');  if (Length(strGet) > 1) then
    mmoShow.Text := strGet;  application.ProcessMessages();  idhttp.IOHandler := idio1;  idio1.SocksInfo.Version := svSocks5;
  idio1.SocksInfo.Host := '203.142.18.123';
  idio1.SocksInfo.Port := 123;
  idio1.SocksInfo.Username := '123';
  idio1.SocksInfo.Password := '123';
  idio1.SocksInfo.Authentication := saUsernamePassword;
  strGet := idhttp.Get('http://www.ip138.com/ip2city.asp');  if (Length(strGet) > 1) then
    mmoShow.Text := mmoShow.Text + strGet + #13#10 + 'END';
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  idhttp := TIdHTTP.Create(self);
  sockinfo1 := TIdSocksInfo.Create(self);
  idio1 := TIdIOHandlerSocket.Create(self);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
  if (IdHTTP <> nil) then
    IdHTTP.Free;
end;end.
结果在设定代理之后的
  strGet := idhttp.Get('http://www.ip138.com/ip2city.asp');时,总是出现异常,读取某地址有问题.
请问,这是indy的错误还是我的错误.idhttp控件要使用socks代理应该如何设置?

解决方案 »

  1.   

    試試以下代碼procedure TForm1.FormCreate(Sender: TObject);
    begin
      IdHTTP1.ProxyParams.ProxyServer:='172.20.100.4';
      IdHTTP1.ProxyParams.ProxyUsername:='mis-jufei';
      IdHTTP1.ProxyParams.ProxyPassword:='1234';
      IdHTTP1.ProxyParams.ProxyPort:=808;
    end;
      

  2.   

    增加一个TIdIOHandlerSocket组件和一个TIdSocksInfo组件把原来的IdHTTP组件的IOHandler属性设置为新增加的TIdIOHandlerSocket组件把新增加的TIdIOHandlerSocket组件的SocksInfo属性设置为新增加的TIdSocksInfo组件然后在TIdSocksInfo组件中正确设置Socks5代理的参数
      

  3.   


    对啊..我现在的做法就是这样的啊.....
    上面的代码就是这样写的......
    但是运行的时候会出现一个内存读取异常.......
    我用的是delphi 7 + indy 10
    不知道你有没有遇到过?
      

  4.   

    你將我寫的代碼使用的控件參數修改替換成TIdIOHandlerSocket组件和TIdSocksInfo组件即可. 
      

  5.   


      strGet := idhttp.Get('http://www.ip138.com/ip2city.asp');
    时,出现read 0000000内存异常....无法跟进去......
    indy的具体版本号是:indy10.0.52_d7我贴子里的代码就是用TIdIOHandlerSocket和 TIdSocksInfo组件的......
    才出来了这个异常..如果用http代理,使用你这个代码是完全没问题的. ..我试过了...
      

  6.   

    我在 Delphi 7  + Indy 9.00.10 上测试了一下, 没问题
      

  7.   

    好...我下载一个indy9试试..
      

  8.   

    请问,delphi 7自带的是不是indy9???
    我现在从网上下载好像没有单儿的indy9下载
      

  9.   


    我测试的就是Delphi 7自带的Indy。
      

  10.   

    我重新装了一个完整的delphi7还是不行。。
    依然是indy10的read异常......兄弟能不能把你的代码发上来我看一下!是不是我的哪一步漏了。
      

  11.   

    这个很好弄啊,我成功了,要是直接把控件放上去的,看了你的代码好像有错误,我学时间不长不知道是不是看错了
    IdHTTP1: TIdHTTP;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        idhttp: TIdHTTP;不知道为什么有两个tidhttp
      

  12.   

    idhttp 支持 Socks5代理吗?
      

  13.   

    把TIdIOHandlerSocket 换成 TIdIOHandlerStack 即可