这个容易, 条件一用 SocketConnection, DCOMConnection 不行,只有在调用服务时才能发现 条件二 SocketConnection.SupportCallbacks 设 false, 要不然由 SocketConnection 出的异常得不到(线程中) 条件三 拦截 Application.OnException, 也可以简单用个 ApplicationEvent有两个异常有关于断线 ESocketConnectionError 在调用中断线, ESocketError 不在调用中断线比方用 ApplicationEvent.OnExceptionif (E is ESocketConnectionError) or (E is ESocketError) then begin ShowMessage('Server is brokern'); 在这做你的事 end;
在clientdataset的onreconcileError中写代码
条件一用 SocketConnection, DCOMConnection 不行,只有在调用服务时才能发现
条件二 SocketConnection.SupportCallbacks 设 false, 要不然由 SocketConnection 出的异常得不到(线程中)
条件三 拦截 Application.OnException, 也可以简单用个 ApplicationEvent有两个异常有关于断线
ESocketConnectionError 在调用中断线, ESocketError 不在调用中断线比方用 ApplicationEvent.OnExceptionif (E is ESocketConnectionError) or (E is ESocketError) then
begin
ShowMessage('Server is brokern'); 在这做你的事
end;
可以用 TRY...EXCEPT来做,也可以用 ApplicationEvent.OnException。
沉沦中......
我用的DCOMConnection连接,所以SocketConnection的话,我的代码改动太夸张了,
我当然按你的方法试了,总感觉不理想,所以我才打算看看这方面的实例(代码),谢谢你
同时,也谢谢大家!
用 DCOM 对像那个配置起来才叫夸张, 要求更多从 DCOMConnection 改到 SocketConnection 基本上没有到代码上改动
((只))打开那个放 Connection 的 DataModule
删了原来的 DCOMConnection, 改成 SocketConnection, 记得name 起成一样, 这个模块所有的cds的 RemoteServer 要设一下
打开其它模块看看, 如果没错的话, 应该都正常run...ok...^_^
1.server受到信息后 反馈给client 如果server在一定时间内还没有受到client的信息,就说明该client吊线.即 server 知道了哪个client断开了
2.client发消息后 没有收到server的反馈信息 也就世道自己已经 down 了
绝对有效 本人就是这么处理的
我现在的就是这样处理的,但好像这样不是很稳定,socket有时出错,这样就不能监测了,我还是再测测看吧。有其他的处理方法吗?
procedure TForm1.ClientDataSet1ReconcileError(
DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
beginend;
Socket: TCustomWinSocket);
begin
MessageBox(Application.handle,'服务器已经断开!','提示',mb_iconerror+MB_OK + MB_DEFBUTTON1+MB_ICONExclamation);
............
end;