客户端正在工作,服务器突然断开了(比如说吊线了),客户端怎样监测,如何在第一时间知道?
分不够可以再加

解决方案 »

  1.   

    错误处理啊
    在clientdataset的onreconcileError中写代码
      

  2.   

    clientdataset组件好像没有onreconcileError事件,我没有找着
      

  3.   

    这个容易, 
    条件一用 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;
      

  4.   

    应用服务器断开时,客户端不会立即得到指示,只有当操作产生异常时,才能检测到。
    可以用 TRY...EXCEPT来做,也可以用 ApplicationEvent.OnException。
      

  5.   

    在多层中,有公文包的形式,首先对数据的信息不会丢了,而动态的检测服务器是否断掉或是其它原因,你可以截获Application.OnException反馈的信息。此时就算你用Try...Except...end也不是很好,它往往对一些系统级的错误处理有些差。你可以为客户端在Application.OnException中对数据进行处理//如:本地保存---------------------
    沉沦中......
      

  6.   

    to:comanche(太可怕) 
      我用的DCOMConnection连接,所以SocketConnection的话,我的代码改动太夸张了,
    我当然按你的方法试了,总感觉不理想,所以我才打算看看这方面的实例(代码),谢谢你
    同时,也谢谢大家!
      

  7.   

    DCOMConnection ? 服务器用的是 DCOM 对像还是 COM+ 对像?
    用 DCOM 对像那个配置起来才叫夸张, 要求更多从 DCOMConnection 改到 SocketConnection 基本上没有到代码上改动
    ((只))打开那个放 Connection 的 DataModule
    删了原来的 DCOMConnection, 改成 SocketConnection, 记得name 起成一样, 这个模块所有的cds的 RemoteServer 要设一下
    打开其它模块看看, 如果没错的话, 应该都正常run...ok...^_^
      

  8.   

    是的,服务器用的是 DCOM 对像,它的配置我可以全部搞定!非法用SocketConnection 而服务器不需要设置?老兄,你饶了我吧,我真不想改了
      

  9.   

    隔一断时间ping 一下服务器行不行?来混分的:)
      

  10.   

    在客户端用时钟控制 向server发信息,
    1.server受到信息后 反馈给client 如果server在一定时间内还没有受到client的信息,就说明该client吊线.即 server 知道了哪个client断开了
    2.client发消息后 没有收到server的反馈信息 也就世道自己已经 down 了
    绝对有效 本人就是这么处理的
      

  11.   

    to :jerbee(波波)
      我现在的就是这样处理的,但好像这样不是很稳定,socket有时出错,这样就不能监测了,我还是再测测看吧。有其他的处理方法吗?
      

  12.   

    clientdataset组件有onreconcileError事件,
    procedure TForm1.ClientDataSet1ReconcileError(
      DataSet: TCustomClientDataSet; E: EReconcileError;
      UpdateKind: TUpdateKind; var Action: TReconcileAction);
    beginend;
      

  13.   

    procedure TF_main.ClientSocket2Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
       MessageBox(Application.handle,'服务器已经断开!','提示',mb_iconerror+MB_OK + MB_DEFBUTTON1+MB_ICONExclamation);
       ............
    end;