Delphi和indy TIDHTTP:区分"服务器未找到"和"未找到"响应错误

时间:2014-05-01 16:04:31

标签: delphi indy

我正在使用indy TIDHTTP编写一种方法来了解我的互联网上的服务器是否已关闭或同一服务器上的页面地址不可用。

我在stackoverflow上复制了另一个线程中给出的建议:

try
  IdHTTP1.Get(mypage_address);
except
  on E: EIdHTTPProtocolException do begin
     if e.errorcode=404 then
        showmessage('404 File not found');
    // use E.ErrorCode, E.Message, and E.ErrorMessage as needed...
  end;
end;

但这样我只能检测服务器响应代码,而不能检测服务器是否完全没有响应。我想这是微不足道的,但我不知道这样做的方法是什么?

2 个答案:

答案 0 :(得分:5)

EIdHTTPProtocolException成功向服务器发送请求并且它将HTTP错误回复发送回TIdHTTP时,会引发TIdHTTP异常。如果根本无法访问服务器,则会引发其他异常(通常为EIdSocketErrorEIdConnectExceptionEIdConnectTimeout)。

try
  IdHTTP1.Head(mypage_address);
except
  on E: EIdHTTPProtocolException do begin
    ShowMessage(Format('HTTP Error: %d %s', [E.ErrorCode, E.Message]));
  end;
  on E: EIdConnectTimeout do begin
    ShowMessage('Timeout trying to connect');
  end;
  on E: EIdSocketError do begin
    ShowMessage(Format('Socket Error: %d %s', [E.LastError, E.Message]));
  end;
  on E: Exception do begin
    ShowMessage(Format('Error: [%s] %s', [E.ClassName, E.Message]));
  end;
end;

答案 1 :(得分:1)

我试图用科学的方式进行服务器/站点检查。但最终只是归结为:

function TFrameSiteChecker.GetSiteHeader(const AUrl: string): Integer;
begin
  try
    idhttp1.Head(AUrl);
    Result := idhttp1.ResponseCode;
  except
    on E: exception do
      Result := 0;
  end;
end;

逻辑是,获得头部减少流量,日志大小等。

该函数有一个正确的结果 - 返回状态代码200,其他任何东西都是失败的。

另外,我没有强制windows / system / indy没有缓冲/缓存内容,所以最终也只是按照计划每隔30分钟运行一次检查。否则(除非其他东西清除缓存)在第一次连接后它总是成功,即使你从网络拔掉机器!