如何让IDHTTP超时后重新连接啊???

时间:2021-04-17 17:28:04
搜了一大堆东西都没有解决问题。
我是想让IDHTTP在失去连接的情况下程序能够自动重新连接。

8 个解决方案

#1


帮顶一下
IDHTTP经常用
但是自动重连一直不会

#2


跟一开始POST或GET一样.重新发下包就行了吧

#3


引用楼主 nkym0626 的回复:
搜了一大堆东西都没有解决问题。
我是想让IDHTTP在失去连接的情况下程序能够自动重新连接。


你怎么判断失去连接的。。。。
你怎么连接的?

#4



      repeat
        bError := True;
        try
          tmpWebCode := UTF8Decode(sIdHTTP.Get(DetailURL));
        except
          bError := False;
          sIdHTTP.Free;
          sIdHTTP := TIdHTTP.Create(nil);
          sIdHTTP.HandleRedirects := True;
          sIdHTTP.ReadTimeout := 10000;
          frmMain.StatusBar1.Panels[4].Text :='详细信息错误  ' + strListCompanyName.Strings[i] + '  ' + IntToStr(k) + '  次';
          if k =4 then
          begin
            bError := True;
            bakStrList.Add(strListCompanyName.Strings[i] + '---详细');
            bakStrList.SaveToFile(ExtractFilePath(ParamStr(0))+fName);
          end;
          inc(k);
        end;
      until (bError);


我改成这样了。。。

#5


if not sIdHTTP.Connected then 
  sIdHTTP.Connect;

#6


我刚好今天在看这个问题,我找到了重新连接抛异常的代码由TIdIOHandler.Connected里的CheckForDisconnect抛出

见CheckForDisconnect的申明:
    procedure CheckForDisconnect(ARaiseExceptionIfDisconnected: Boolean = True;
     AIgnoreBuffer: Boolean = False); virtual; abstract;

所以想办法让IOHandler重新连接一次应该就可以了。

BTW.我的INDY是10.5.8.0

#7


我已经弄好了,自动重连的代码正解如下:

  if Assigned(IdHTTP.IOHandler) then
    IdHTTP.IOHandler.Open;

  IdHTTP.Post(FURLBase + URLPath, Strings, AResponseContent); //你自己的使用URL重连的代码

5楼的代码必须在设置好IdHTTP的主机等信息的情况下才能那样用,然而通常我们是直接使用一个URL,写代码去分解URL等于是在重复造了*

再继续推可得,如果该IDHTTP已经成功请求过一次,要更换一个URL地址来请求,可以尝试FreeAndNil掉IdHTTP.IOHandler因为之前生成的IOHandler是指向原地址的。我这暂时没这需求,需要的可以自己去试试。

#8


刚才试了
IdHTTP.IOHandler=nil;(见SetIOHandler的代码)
后也可以重新请求,
不过是重新再生成一个IOHandler了,除非更换请求的地址最好还是不要这样。

#1


帮顶一下
IDHTTP经常用
但是自动重连一直不会

#2


跟一开始POST或GET一样.重新发下包就行了吧

#3


引用楼主 nkym0626 的回复:
搜了一大堆东西都没有解决问题。
我是想让IDHTTP在失去连接的情况下程序能够自动重新连接。


你怎么判断失去连接的。。。。
你怎么连接的?

#4



      repeat
        bError := True;
        try
          tmpWebCode := UTF8Decode(sIdHTTP.Get(DetailURL));
        except
          bError := False;
          sIdHTTP.Free;
          sIdHTTP := TIdHTTP.Create(nil);
          sIdHTTP.HandleRedirects := True;
          sIdHTTP.ReadTimeout := 10000;
          frmMain.StatusBar1.Panels[4].Text :='详细信息错误  ' + strListCompanyName.Strings[i] + '  ' + IntToStr(k) + '  次';
          if k =4 then
          begin
            bError := True;
            bakStrList.Add(strListCompanyName.Strings[i] + '---详细');
            bakStrList.SaveToFile(ExtractFilePath(ParamStr(0))+fName);
          end;
          inc(k);
        end;
      until (bError);


我改成这样了。。。

#5


if not sIdHTTP.Connected then 
  sIdHTTP.Connect;

#6


我刚好今天在看这个问题,我找到了重新连接抛异常的代码由TIdIOHandler.Connected里的CheckForDisconnect抛出

见CheckForDisconnect的申明:
    procedure CheckForDisconnect(ARaiseExceptionIfDisconnected: Boolean = True;
     AIgnoreBuffer: Boolean = False); virtual; abstract;

所以想办法让IOHandler重新连接一次应该就可以了。

BTW.我的INDY是10.5.8.0

#7


我已经弄好了,自动重连的代码正解如下:

  if Assigned(IdHTTP.IOHandler) then
    IdHTTP.IOHandler.Open;

  IdHTTP.Post(FURLBase + URLPath, Strings, AResponseContent); //你自己的使用URL重连的代码

5楼的代码必须在设置好IdHTTP的主机等信息的情况下才能那样用,然而通常我们是直接使用一个URL,写代码去分解URL等于是在重复造了*

再继续推可得,如果该IDHTTP已经成功请求过一次,要更换一个URL地址来请求,可以尝试FreeAndNil掉IdHTTP.IOHandler因为之前生成的IOHandler是指向原地址的。我这暂时没这需求,需要的可以自己去试试。

#8


刚才试了
IdHTTP.IOHandler=nil;(见SetIOHandler的代码)
后也可以重新请求,
不过是重新再生成一个IOHandler了,除非更换请求的地址最好还是不要这样。