请教 : 当服务端断线重启后,客户端怎么才能重新连接到服务端 ?(100分)

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

activexform

Unregistered / Unconfirmed
GUEST, unregistred user!
您好,客户端如下处理 :

procedure TForm1.Connect ;
begin
ClientSocket1.Open ;
end ;

procedure TForm1.FormCreate(Sender: TObject);
begin
if ClientSocket1.Active = false then
begin
try
Connect ;
except
end ;
end ;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
case ErrorEvent of
eeConnect: Connect ;
end;
ErrorCode := 0;
if ClientSocket1.Active then
ClientSocket1.Active := False;
end;

这样可以保证当 TServerSocket 没有打开时客户端可以不断地去连接服务端直到
TServerSocket打开 ; 现在的问题是 :
假设通信正常(服务端已经打开,双方可以正常通信) , 这时关闭 TServerSocket ,
然后重新启动TServerSocket,这时候客户端连接不到服务端了,只有重新启动客户端才能
连接到服务端 ---- 也就是说服务端死机后服务端和客户端都必须重新启动一次 ; 但从
代码看当连接不成功时后反复连接(好像没有错误), 请问为什么 ? 应该怎样解决 ?

谢谢
 
可能SockServer断开后重启并不触发.ClientSocket1Error事件,你跟踪看一下。

可以在Application.OnException里面判断是不是因为连接断开造成的错误,如果是,则
尝试重新连接。
 
您好,怎么判断呢 ?
 
可以根据异常的类型,也可以根据错误信息判断。
 
您能写点代码么 ?:) 初学 ... :) ,谢谢
 
TCP对于异常断开是不保证弹出错误的,原因是最开始的时候
美国军方为了保证网络出现问题恢复以后继续通讯,而且开
始的时候机器配置都不高,为了节约资源和网络资源都没有
使TCP保持定时探测,后来的SOCK有个选项可以打开定时探测
WIN2K可以支持对于不同的连接使用不同的探测时间,但是这
个时间太长,好象最少是2个小时,基本上没有用
 
客户端检测到断线后就 重新连接。
 
张无忌 : 那您说这个问题应该怎样解决 ?
 
没收到一次数据或则发一次数据都改写一个事件变量,
用Timer定时判断,如果有一定时间没有收到数据就断
开连接,重新连接服务器
 
我刚刚接触这个,您能简单写一个例子吗 ? 谢谢
 
我说的够明白的拉[:(]
 
我不懒惰了:)我先试试:)
 
这个问题可以这样解决,但这样一来客户端却收不到服务端回送的数据了 ,怎么做 ?

var
b : Boolean ;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
b := Not b ;
Label1.Caption := Socket.ReceiveText ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
b := False ;
if ClientSocket1.Active = false then
begin
try
Connect ;
except
end ;
end ;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Not b then
begin
ClientSocket1.Active := False ;
Connect ;
end
Else
begin
b := Not b ;
end ;
end;

谢谢您
 
你没明白我的意思,你难道不会把哪个改成一个GetTickCount,
在Timer事件里
if ClientSocket.Active then
begin
if GetTickCount-dwTime>300000 then
begin
ClientSocket.Active;=false;
ClientSocket.Active:=true;
end;
end;
 
还是不行

您能留个信箱我将程序发给您,帮我看一下好么 ? 谢谢您
 
// 接收数据和发送数据后都取了 t := GetTickCount ;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if ClientSocket1.Active then
if GetTickCount - t > 10000 then
begin
ClientSocket1.Active := False ;
Connect ;
end ;
end;

// 重启服务端后客户端无法和服务端通信了
 
使用联机信件来判断网络超时, 如果超时或者网络出错, 则可以断开, 等待一段时间后
重新连接服务器
 
LiChaoHui : 您能给我具体讲讲么 ? 我初学
 
对这些一点不懂
 
网络连通之后, 客户端定时给服务器端发送一个测试是否正常连接的空信件,
数据量可以很小,
然后等待回应, 如果回应超时, 则网络肯定有问题, 断开网络 ClientSocket.Active := False;

但不要马上连接, 等待一段时间后, 开始尝试连接,
如果连接失败, 则再等待一段时间进行尝试,

我说的这种方式是, 双方以包作为数据通信单位的通信方式
 
后退
顶部