DataSnap的如果网络断线,如何恢复?

语言:Xe2 框架:DataSnap
问题:DataSnap很简单,把一个二层的程序改写成三层,很简单就实现了,例如:把原先的二层访问函数,堆到TServerMethods1单元即可,然后就实现了三层。但是在测试时有个问题,生产环境可能非常恶劣,经常回发生断线情况,我们要保证可以自动恢复功能,即断线一段时间,可以修复,二层很简单,直接做一个timer,如果访问失败,就定时去连接,可以成功恢复。但是在datasnap时,自动恢复功能无法实现,主要表现为,比如正常访问中间层一次后,关闭中间层,此时客户端访问失败,跟踪后用客户端timer重新连接访问中间层,每次
出现以下各种不同错误(有10054,10038,10061错误),并不能实现恢复。


 raised exception class EIdNotASocket with message 'Socket Error # 10038
Socket operation on non-socket.'.

----------
Debugger Exception Notification
----------
Project PrjV.exe raised exception class EIdCouldNotBindSocket with message 'Could not bind socket. Address and port are already in use.'.
----------
Break   Continue   Help   
----------




----------
Debugger Exception Notification
----------
Project PrjV.exe raised exception class EIdClosedSocket with message 'Disconnected.'.
----------
Break   Continue   Help   
----------


----------
Debugger Exception Notification
----------
Project PrjV.exe raised exception class EIdSocketError with message 'Socket Error # 10022
Invalid argument.'.
----------
Break   Continue   Help   
----------

尤其是有2个错误,Session has expired,最后会出现一个index of bound越界错误,
一旦出现就无法自动恢复(调用timer重复调用一个最简单的中间函数GetDbServerTime)

ps:我也改了lifecycle,session 改成Invocation,Application,好像也不行。

大家都知道datasnap底层是indy实现的,怎么可以实现断线datasnap自动恢复功能?

 

 

timer代码很简单:
var adbsevertime :TDateTime;
begin
  try
      adbsevertime :=
          ClientModule1.ServerMethods1Client.GetDbServerTime;
      if adbsevertime <> 0 then
      begin
        gdbStatus := true;
        TimerReconnet.Enable:=false;
      end;
     
    except
      on E: Exception do
      begin
       
          TimerReconnet.Enable:=true;
      end;
    end;
end;

GetDbServerTime是dephi自动生成的客户端访问中间层的方法

 

网上找到三种方法:
http://www.cnblogs.com/yagzh2000/archive/2013/04/27/3046637.html

http://blog.csdn.net/sunstone/article/details/5023718
http://blog.163.com/bin0315@126/blog/static/4066264220128414025829/
类似)


http://bbs.2ccc.com/topic.asp?topicid=396438

我每个测试一下,到时候结果通知大家。

posted @   findumars  Views(1241)  Comments(0Edit  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2016-01-12 Mac App Store应用签名和pkg签名(必须签名后才能销售)
2016-01-12 QT5.6 编译SQLServer驱动
2016-01-12 Qt5程序开机自启动(windows)
2016-01-12 由基于qml,c++的串口调试工具浅谈qml与c++混合编程
2016-01-12 qt5_qml_Opengl_shader 第一弹----------------------openglunderqml的简化及介绍
2015-01-12 读书方法,以及先后顺序(先实践,后理论)
点击右上角即可分享
微信分享提示