【100分】ClientSocket重新连接问题

chain0509 2009-06-10 05:18:34
ClientSocket和服务器相连接,此时若服务器突然断开后再开启时,ClientSocket发送的数据服务器是收不到的,需要和服务器重新连接后才能收到,我想问的是 用什么方法可以实现自动重新连接呢?最好给点代码,我用Timer控件,每秒检查一下,但是发现不行,发送第二次数据后就报错了(无用的指针),服务器是客户的,只给了端口号和IP 不知道用的是什么 如果有大侠用其他空间可以实现的 麻烦一并送上 谢谢了
...全文
179 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
chain0509 2009-06-12
  • 打赏
  • 举报
回复
算了 结贴吧
chain0509 2009-06-11
  • 打赏
  • 举报
回复
我现在不用Timer了,我写了个连接的代码 如下
procedure TForm1.Conn;
var
iTimeOut: Integer;//´ÓOpenµ½ÏÖÔÚ¾­¹ýµÄÃëÊý
begin
bFailToConn := False;
Clientsocket1.Open;
tmBegin := Time;

while (not Clientsocket1.Active)do
begin
Application.ProcessMessages;
if bFailToConn then
begin
//MessageBox(Handle, PChar('ÎÞ·¨Á¬½Óµ½Ä¿µÄ¼ÆËã»ú.'), 'Á¬½Óʧ°Ü...', MB_ICONERROR);
Memo1.Lines.Add('Á¬½Óʧ°Ü,ÎÞ·¨Á¬½Óµ½Ä¿µÄ¼ÆËã»ú.');
Memo1.Lines.Add('ÕýÔÚÖØÐÂÁ¬½Ó£¬ÇëÉÔºò.');
Clientsocket1.Close;
exit;
end;

iTimeOut := StrToInt(FormatDateTime('ns' , Time - tmBegin));

if iTimeOut >= 5 then//³¬Ê±5Ãë
begin
//MessageBox(Handle, PChar('ÒòΪ³¬Ê±£¬ÎÞ·¨Á¬½Óµ½Ä¿µÄ¼ÆËã»ú.'), 'Á¬½Óʧ°Ü...', MB_ICONERROR);
Memo1.Lines.Add('ÒòΪ³¬Ê±£¬ÎÞ·¨Á¬½Óµ½Ä¿µÄ¼ÆËã»ú.');
Memo1.Lines.Add('ÕýÔÚÖØÐÂÁ¬½Ó£¬ÇëÉÔºò¡£');
Clientsocket1.Close;
exit;
end;
end;
end;

但是只能执行一次,一次以后程序运行就结束了,我想问的是,在哪里加如果连接失败继续执行TForm1.Conn的操作的代码,怎么加?
chain0509 2009-06-11
  • 打赏
  • 举报
回复
可否给点具体的代码 思路都知道 Timer里面我就是这样写的

if not ClientSocket1.active then ClientSocket1.active:=true

并且在connection里面Timer.enable:=false 在disconnection里面timer.enable:=true
chain0509 2009-06-11
  • 打赏
  • 举报
回复
我现在想要实现的是 程序启动的时候如果连接失败就继续连接 和 程序运行期间如果连接中断了则继续重新连接
kampan 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chain0509 的回复:]
我现在不用Timer了,我写了个连接的代码 如下
。。。。。。。。。。。
但是只能执行一次,一次以后程序运行就结束了,我想问的是,在哪里加如果连接失败继续执行TForm1.Conn的操作的代码,怎么加?
[/Quote]

在发送数据处,加上个函数调用,我个人认为不要一直尝试连接,设置个次数更好,比如尝试5次,中间可加延迟,控制每一次尝试连接的间隔时间。另外将你上边的Conn函数改为带返回值的Boolean,连上置为True;

try
发送数据
except
for I := 0 to 4 do
begin
if Conn then
break
else
sleep(时间间隔); 或用其他延时方式
end;
end;

chain0509 2009-06-11
  • 打赏
  • 举报
回复
服务器不是我们的 不能控制的啊
yuyuhaso 2009-06-11
  • 打赏
  • 举报
回复
做心跳保持
TIMER负责检查服务器是否有反应
服务器在接受心跳包没有应答的情况下就认为是断开了,设置一个信号量
如果信号量异常,则下次TIMER到期后负责连接服务器。
AuroraAlpha 2009-06-10
  • 打赏
  • 举报
回复
一般拔网线是捕获不到Error的,发送数据之前应该先发送一个测试包给服务器,服务器做出反应回复一个包后客户端再发送正文,如果收不到回复就尝试重新连接服务器
aluyue 2009-06-10
  • 打赏
  • 举报
回复
服务器突然断开
应该可以在客户端的OnError事件里捕获到吧?
shuihan20e 2009-06-10
  • 打赏
  • 举报
回复
思路是和你一样的,一个timer,帖出你的代码看看撒

1,593

社区成员

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

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