我正在使用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;
但这样我只能检测服务器响应代码,而不能检测服务器是否完全没有响应。我想这是微不足道的,但我不知道这样做的方法是什么?
答案 0 :(得分:5)
当EIdHTTPProtocolException
成功向服务器发送请求并且它将HTTP错误回复发送回TIdHTTP
时,会引发TIdHTTP
异常。如果根本无法访问服务器,则会引发其他异常(通常为EIdSocketError
,EIdConnectException
或EIdConnectTimeout
)。
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分钟运行一次检查。否则(除非其他东西清除缓存)在第一次连接后它总是成功,即使你从网络拔掉机器!