IDTCPClient,IDTCPServer数据传输问题 ( 积分: 100 )

  • 主题发起人 主题发起人 yongqiang
  • 开始时间 开始时间
Y

yongqiang

Unregistered / Unconfirmed
GUEST, unregistred user!
在广域网上用INDY中的IDTCPClient,IDTCPServer进行数据传输,在IDTCPClient发送数据的时候,有时IDTCPClient会发生错误而主动断开连接,此时IDTCPServer正常是应该能截获此异常而断开连接。但是现在发现有时IDTCPServer不能处理这个异常、程序停止了不能断开连接。部分代码如下:
IDTCPClient发送数据
with IDTCPClient do begin
Try
Connect(10000);
//分成多个数据包发送数据
Except
DisConnect;
end;
end;
IDTCPServer.Excute接收数据
with AThread do begin
AThread.Connection.ReadTimeOut := 10000;
Try
if (Athread.Connected) and (not AThread.Terminated) then begin
//接收数据
end;
Except
AThread.Connection.DisConnect;
end;
end;
IDTCPServer的OnDisconnect事件加入ShowMessage('Client DisConnect');
但是有时能触发IDTCPServer的OnDisconnect事件,有时就不能执行IDTCPServer的OnDisconnect事件。
发送和接收数据分别用WriteBuffer和ReadBuffer
问:怎么样才能让IDTCPClient 发生异常断开时IDTCPServer也自动断开,并执行OnDisconnect事件
 
在广域网上用INDY中的IDTCPClient,IDTCPServer进行数据传输,在IDTCPClient发送数据的时候,有时IDTCPClient会发生错误而主动断开连接,此时IDTCPServer正常是应该能截获此异常而断开连接。但是现在发现有时IDTCPServer不能处理这个异常、程序停止了不能断开连接。部分代码如下:
IDTCPClient发送数据
with IDTCPClient do begin
Try
Connect(10000);
//分成多个数据包发送数据
Except
DisConnect;
end;
end;
IDTCPServer.Excute接收数据
with AThread do begin
AThread.Connection.ReadTimeOut := 10000;
Try
if (Athread.Connected) and (not AThread.Terminated) then begin
//接收数据
end;
Except
AThread.Connection.DisConnect;
end;
end;
IDTCPServer的OnDisconnect事件加入ShowMessage('Client DisConnect');
但是有时能触发IDTCPServer的OnDisconnect事件,有时就不能执行IDTCPServer的OnDisconnect事件。
发送和接收数据分别用WriteBuffer和ReadBuffer
问:怎么样才能让IDTCPClient 发生异常断开时IDTCPServer也自动断开,并执行OnDisconnect事件
 
不是IDTCPServer的问题,是TCP机制本身就没有异常检测,如果是因为网络异常断开,IDTCPServer是无法检测到的。
你说有时能触发IDTCPServer的OnDisconnect事件,有时就不能执行IDTCPServer的OnDisconnect事件,你可以用拔掉网线的办法来再现这个异常,你会发现IDTCPServer根本检测不到断开。
这个问题的帖子也应很多,解决办法最终只有加个脉搏应答。就是IDTCPServer发现长时间没有收到IDTCPClient的数据,就向Client发送数据,然后等待应答,没有应答就是异常。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部