delphi idhttp在ADSL断网重连后会出错,是怎么回事?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi idhttp在ADSL断网重连后会出错,是怎么回事?相关的知识,希望对你有一定的参考价值。

我在多线程中使用idhTTP,由于需要更换IP地址,所以在访问完一个网址后,就自动断开ADSL的网络并重新连接上,但之后就访问网址就出错了,好像是不能访问一样,但网络是的的确确重新连接上了,这是怎么回事?有什么解决方法不?

参考技术A
这只灰鸽子可是个属于“三隐”性质的木马,一般的木马查杀软件和杀毒软件还真不能发现它!
你可以试试用下面的这2个软件来清除它:
1.木马杀客 5.2 绿色特别版

这个软件的压缩包里有灰鸽子的专门清除程序

2.从网上下一个叫“冰刃”的软件。这是一个绿色免安装的小软件,可以放心使用。
这个是下载地址:

这个是它的详细用法:

一般来说,不管是木马、病毒进入我们的机器后都是“三隐”的即隐进程、隐服务、隐文件的,利害的能将杀毒软件有实时监控给杀死!但在这个冰刃里,它是无法遁身的。开启的非法进程会以红色显示出来。
PS:在使用这个软件前,你最好先认真看一下帮助文档,这对你清除病毒有很好的帮助。
参考技术B 这个idhttp使用TCP/IP协议,需要握手过程,断开ADSL后等于取消握手,这时需要重新连接。
所以在线程应该有一个重新连接的过程。追问

是 idhttp1.connect 吗?

追答

可以ondisconnect事件中加入处理暂停发送接数据,重新连接

本回答被提问者采纳
参考技术C 这个你可以先测试一下是否处于连网状态下,如果连网的话,再连接!
再连接后使用idhttp1.disconnect;追问

一直处于连网状态,也在连接后使用idhttp1.disconnect;还是出现错误:socket 10001 之类的

参考技术D 有个笨方法
动态生成的idhttp,在使用之后就FREE,然后断网,再然后重新连接,连接完后再新创建IDHTTP追问

可是我要保存好COOKIE的

Delphi使用ADO连接网络数据库,断网后重连问题

原始文章: https://blog.csdn.net/blog_jihq/article/details/11737699#

使用TADOConnection对象连接网络数据库(以MySQL为例),当本地网络断开时,连接对象的Connected属性不会发生变化,一直是True。

即使将连接对象的KeepConnection属性设置为false,若网络断开,在不尝试连接数据库的情况下,Connected属性也是true;在尝试连接数据库失败之后,Connected属性才变为false。

var
  ADOCon: TADOConnection;
begin
  //to do 创建ADOCon对象,并为ADOCon赋值连接字符串,代码省略
 
  ADOCon.KeepConnection := false;
  //此时网络连接正常
  ADOCon.Open;  //或者ADOCon.Connected := true;
  ADOCon.Connected; //该属性值为true
  //断开网络连接
  ADOCon.Connected; //该属性值为true
  ADOCon.Open; //此时连接出现异常
  ADOCon.Connected; //该属性值为false
end;

 

因此在代码中无法使用Connected属性来判断ADO对象是否连接正常;而且如果使用此连接对象在查询数据库异常后,直接关闭再打开连接会没有效果,无法连接成功,必须重新打开运行程序,或者重新创建连接对象。

针对这种情况,网络上通用的解决办法就是增加一个timer定时器,创建新的测试连接对象定时去连接数据库,若连接失败则关闭连接对象并重连,以实现断网后的自动重新连接,在断网后操作数据库时不出现卡顿现象。

procedure TForm1.tmr1Timer(Sender: TObject);
  function TestConnected: Boolean;
  var
    aCon: TADOConnection;
  begin
    Result := False;
    aCon := TADOConnection.Create(nil); //创建临时对象
    try
      aCon.ConnectionString := const_DBCON_MYSQL; //连接字符串
      try
        aCon.Connected := True;
        Result := True;
      except
        Exit;
      end;
    finally
      aCon.Free;
    end;
  end;
begin
  if not TestConnected then //使用临时对象判断数据库连接状况
  begin
    FADOCon.Close; //根据临时对象连接状况操作连接对象,若无法连接则关闭连接对象,若连接正常则打开连接对象
  end
  else
  begin
    if FADOCon.Connected then
      FADOCon.Connected := True;
  end;
end;

 

不过,如果断网或者数据库挂掉的情况非常少,而且对断网后查询数据出现卡顿现象没有特殊要求,那么可以在每次操作完数据库后关闭连接对象,这样即便是断网状态下,连接也是关闭的,查询数据库出现异常也不会影响网络恢复后的数据库操作。

procedure TForm1.btn3Click(Sender: TObject);
begin
  try
    FADOQuery.Close;
    FADOQuery.Connection := FADOCon;
    FADOQuery.SQL.Text := select * from fp_kpxx;
    FADOQuery.Open; //连接对象关闭状态下,查询时会自动连接
    ShowInfoDlg(IntToStr(FADOQuery.RecordCount));
    FADOCon.Close;
    //此时断开网络
     FADOQuery.Open; //此时出现异常
     FADOCon.Close;
    //此时恢复网络
     FADOQuery.Open; //此时查询正常
     FADOCon.Close;
  except
    ShowInfoDlg(查询失败);
  end;
end;

连接对象Close之后若网络未断开,然后使用TADOQuery对象操作数据库时不会重新连接数据库,没有时间延迟;若连接对象Close之后网络断开,再使用查询对象操作数据库时会重新连接数据库,有一定的数据延迟。所以使用这种解决办法虽然可以在断网后重连,但断网后的第一次数据库操作会有卡顿现象。

以上是关于delphi idhttp在ADSL断网重连后会出错,是怎么回事?的主要内容,如果未能解决你的问题,请参考以下文章

IM即时通讯开发之WebSocket断网重连更快的方法

前端网络监控与断网重链

Delphi使用ADO连接网络数据库,断网后重连问题

mqqtt 离线消息

Figma设计断网了怎么办?

bug-004tcp网络断开重连后,客户端recv函数一直阻塞,不会返回