如何控制客户端连接中间层的时间(在线等待)? (100分)

  • 主题发起人 主题发起人 adonlau
  • 开始时间 开始时间
A

adonlau

Unregistered / Unconfirmed
GUEST, unregistred user!
因为常有这样的情况,当应用服务器掉线,或在客户端指定了错误的应用服务器地址的时候,客户端程序就会一直停在启动界面,要过几分钟才会提示错误。
一般来说,SocketConnection连接应用层只需要1-3秒时间,我能否设定一个时间,比如说10秒钟以后若仍不能连接到应用层,则由程序提示“连接超时”并退出系统。
100分奉上,请各位高手帮忙,分不够可以加。
 

我只知道先用一个ClientSocket试连一下来判断,不知道有没有更好的方法
学习一下
 
请大家关注一下,这个问题说大不大,说小也不小,其实若没有很好的连接时间控制,这个程序就不会一个很好的应用。我做两个项目,都存在这个问题,一直让我头疼。
 
服务端在客户端连接的时候返回一个消息,客户端加一个检测功能,在规定时间内
检测不到连接成功消息则断开连接并提示。
不过socket控件应该都有超时设置的,找一下吧。具体我也没用过。
 
无人能解决这个问题吗??
只要做个三层的,都应该会碰到这个问题呀。
 
procedure TForm2.btnConnectClick(Sender: TObject);
var
vtblList : Variant;
iCount : Integer;
begin
Timer1.interval:=10000;
Timer1.Enabled := True;
SocketConnection1.Connected := True;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
SocketConnection1.Connected := False;
timer1.Enabled := False;
ShowMessage('联接超时');
close;
end;
 
楼上的方法是不管用的,因为此时主线程已经“死了”,没法响应你的定时器事件了,
我专门研究过这个问题,如果ScktSrvr.exe 没有打开的画,
程序停止的时间为 3 分钟, 在这三分中内程序发生了死锁,
最后等待超时,才活过来,解决的办法如下,
找到SConnect.pas 复制到当前目录,找到下面代码出现的位置
procedure TStreamedConnection.InternalClose;
begin
if Assigned(FTransport) then
begin
FTransport.OnTerminate := nil;
FTransport.Terminate;
PostThreadMessage(FTransport.ThreadID, WM_USER, 0, 0);
然后在它的后面加上一句代码:
if GetCurrentThreadID = MainThreadID then
Classes.CheckSynchronize;
如果你足够细心的话,你会看到后面的这句代码
WaitForSingleObject(FTransport.Handle, 180000);
这就是程序假死正好 3 分钟的原因所在,
加上前面的那一句,就不会再这样了,连接失败时能够快速的返回,并显示出错信息
楼主试一下,
如果有效就把分给我吧,
如果想了解更多的情况,请参照
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1848198
 
LiChaoHui的是正确的
 
to LiChaoHui
谢谢你!我的启发较大。
将你的代码试过,确实可以,不过仍然会死50秒左右,这个时间仍然很长。
我能否指定更短的响应时间呢?比如说:15秒(我只能接受小于15秒的等待)
我试过将WaitForSingleObject(FTransport.Handle, 180000)中的180000改为更短,但是没有用。请指教。
 
to LiChaoHui
问题的结果不尽人意。我上过你的贴子,看过其中的讨论。
结果发现:
连接前加代码SocketConn.SupportCallbacks := False;
与你在SConnect.pas中的加的
if GetCurrentThreadID = MainThreadID then
Classes.CheckSynchronize;
结果一样,都能够捕获,但都需要等待50-60秒左右。
难道真的不能定义一个更短的时间吗??还是头疼,(50-60秒用户仍无法接受)。
 
如果是这样的话,可能是因为连接失败时所花的时间太长,
不过奇怪了,我的程序能够立即返回,只会延迟几秒钟的时间,
(当然我是在本机做的测试)
你可以用一个ClientSocket建立连接,看一下会用多长时间
 
to LiChaoHui
你说得很对,在本机花费时间非常短,那如何减少连接失败时所花的时间呢?
你什么好办法吗?
 
还有一个比较笨的办法,是修改SConnect.pas单元,
在打开连接前,创建一个监视线程,连接成功后通知此监视线程自己释放
如果超过等待时间没有连接成功,则使监视线程强行终止
连接线程,但是不知道会不会带来不可预料的其它后果,
譬如,连接线程被强行终止后,能否再次进行连接
 
结了吧,继续关注该问题。
 
后退
顶部