急急急:谁能解决TIdHTTP.Get超时无响应的问题???我愿意出RMB解决。

icedheart 2008-04-13 07:33:23
关于在目的URL繁忙或者网络异常的情况下,,TIdHTTP.Get(URL)没有任何信息反馈,一直阻塞在这里,导致整个线程停止,try...except也无法捕获异常,网络搜索这方的解决办法,但是一直找不到,ConnectTimeout或者ReadTimeout根本不起作用,哪位大侠有这方面的解决办法的???请出手相助,我出RMB也行,不过不要太多就可以了……
...全文
1680 39 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
likeyrain 2010-07-01
  • 打赏
  • 举报
回复
可以用截包工具截一下有没有在工作啊,再根据截到的包分析是那步有问题,
apilove 2010-06-29
  • 打赏
  • 举报
回复
换成ICS !!
Indy问题多!!!
Frank.WU 2010-06-29
  • 打赏
  • 举报
回复
放在线程里面,设置线程中断标志。需要的时候就退出线程。
singlexinglove 2010-06-29
  • 打赏
  • 举报
回复
帮顶一下 ,期待问题解决!!!
nkym0626 2010-06-23
  • 打赏
  • 举报
回复
学习
Flymorn 2010-06-23
  • 打赏
  • 举报
回复
可以使用多线程解决这个问题,把idhttp放到线程里动态创建,这样即使会卡死,也不会卡死主线程。

实际上,卡死还是会发生,只不过在子线程里发生了。

ConnectTimeout 在网络异常或服务器失去响应的情况下 不起作用的,因为 indy 是阻塞式通讯,没有返回就一直等待,直到超时,你可以看下这篇文章提到的方法:
http://www.piaoyi.org/computer/Delphi-INDY-IDFTP-IDHTTP-connecttimeout.html

彻底解决。
knowledge_Is_Life 2008-04-30
  • 打赏
  • 举报
回复
接分是王道!
ERR0RC0DE 2008-04-25
  • 打赏
  • 举报
回复
自己写个SOCKET API client,自己设置ReadTimeout,保证没事,:D
icedheart 2008-04-25
  • 打赏
  • 举报
回复
请问换什么控件可以代替indy?
zzzl 2008-04-21
  • 打赏
  • 举报
回复
以前写用它写抓取网页程序的时候,确实碰见过,百思不得其解,换控件解决的

indy挺垃圾的
enli 2008-04-19
  • 打赏
  • 举报
回复
嗯,有这个问题的,详细见:http://i.92wy.com/html/96/756996-91916.html
icedheart 2008-04-19
  • 打赏
  • 举报
回复
做过的高手出来指点一下,谢谢。
icedheart 2008-04-18
  • 打赏
  • 举报
回复
高手都隐身了么?
icedsoul 2008-04-16
  • 打赏
  • 举报
回复
只要是IDHTTP.GET卡住了就是无限时卡,一直卡着不动了。程序非常简单,不存在问题。

try
IdHTTP.Get(SUPAddress+'Supplier/ProductSaving.asp'); //网络正常的时候没有问题,要是网络慢的时候就一直卡在这里不动了
Memo_Msg.Lines.Add(IntToStr(IdHTTP.ResponseCode));
except
//
end;
ideation_shang 2008-04-16
  • 打赏
  • 举报
回复
服务器一般情况下tcp连接超时时间为5分钟
icedsoul 2008-04-16
  • 打赏
  • 举报
回复
IDHTTP一套那么强大的组件,不应该考虑不到这些网络因素吧???
icedsoul 2008-04-16
  • 打赏
  • 举报
回复
问题就在这里了:

在JAVA服务器端打上了断点的话,哪么是会停在哪里,一直等服务器响应,一般情况是不会的,很快就能返回端服端的信息
到客户端.

如果发送的请求包丢失又或者服务器没有返回数据包、返回的数据包丢失,那么就一直停在这里了。怎么处理这个问题???在网络繁忙、或者目的服务器负载比较重的情况下就发生了我碰到的现象了。

求大侠们想想解决办法。
skylkj 2008-04-16
  • 打赏
  • 举报
回复
IdHTTP是阻塞式的
在indy misc里有个IdAntiFreeze,放上后可以改成非阻塞式
myheartzhang 2008-04-16
  • 打赏
  • 举报
回复
不见可能的,我们就是用IdHTTP1来下载的,一开启程序的时候先检测服务器上有没有最新的版本,
IdHTTP1 可以设置连接时间的,如果超过这个时间,他自动会返回1006,超时错误,
没有一直卡在哪里,然后跳出下载.我们是在JAVA服务器端通信时,如果是调试的时候,
在JAVA服务器端打上了断点的话,哪么是会停在哪里,一直等服务器响应,一般情况是不会的,很快就能返回端服端的信息
到客户端.

procedure HttpDownLoad(const aURL, aFile: string; bResume: Boolean);
var
tStream: TFileStream;
IdHTTP1:TIdHTTP;
begin

try
//如果文件已经存在
if FileExists(aFile) then
tStream := TFileStream.Create(aFile, fmOpenWrite)
else
tStream := TFileStream.Create(aFile, fmCreate);

IdHTTP1:=TIdHTTP.Create(nil);
if bResume then //续传方式
begin
IdHTTP1.Request.ContentRangeStart := tStream.Size - 1;
tStream.Position := tStream.Size - 1; //移动到最后继续下载
IdHTTP1.Head(aURL);
IdHTTP1.Request.ContentRangeEnd := IdHTTP1.Response.ContentLength;
end
else //覆盖或新建方式
begin
IdHTTP1.Request.ContentRangeStart := 0;
end;
try
IdHTTP1.Get(aURL, tStream); //开始下载
finally
tStream.Free;
end;
except
on E: Exception do
begin
raise Exception.Create('下载文件'+aURL+'失败:'+e.Message);
end;
end;
end;
skylkj 2008-04-16
  • 打赏
  • 举报
回复
看了下IdAntiFreeze和IdAntiFreezeBase两个单元.好像不是创建线程的.....

大致看了下,好像是在超时之前一直是一个循环,但是在循环里面有Application.ProcessMessages;所以主程序的界面消息仍然可以得到响应

有哪位大大深入研究过的来说说哈
加载更多回复(19)

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧