导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2022/1/15 10:59:43
标题:
有用过datasnap回调的吗?想回调unigui实现数据推送
浏览:1862
加入我的收藏
楼主:
1、datasnap 有很好的回调机制,稳定安全,这是毋容置疑的。 我已经通过datasnap回调实现了win32\android下客户端之间的通信。 datasnap 要实现web的回调,可以走javascript的路子,但js与web组件的交互,真不是件轻松的事。 2、datasnap回调,关键是重载TDBXCallback类的 Execute函数,此函数正是供服务器回调的函数。 TUniCallback = class(TDBXCallback) public constructor Create; function Execute(const Arg: TJSONValue): TJSONValue; override; end; Arg: TJSONValue参数是服务器推送过来的json格式的值,您可以在Execute获得从服务器推送过来的任意格式json数据,可以是字符串、数据、图片等任意对象。 3、datasnap在unigui\intraweb这类web工具的回调 function TUniCallback.Execute(const Arg: TJSONValue): TJSONValue; var AStr: String; begin if (Arg is TJSONString) then begin AStr:=Arg.ToString ; Result:=TJSONString.Create(AStr);//已经可以执行到此 (UniMainModule.MainForm.FindComponent('UniEdit1') as TUniEdit).Text:=AStr;//这里无法执行 end; end; datasnap可以成功执行此回调函数,但在些函数中无法访问unigui中的任何元素,包括uniMainModule、uniApplication、uniSession等这些全局对象,只要一访问必AV。 4、由于无法访问unigui的任何元素,目前,datasnap对unigui的回调技术止步于此,我想这肯定还是能够找到突破的地方,因为用上述方法,datasnap 能够成功实现datasnap 对intraweb的回调。 5、综上,回调技术是现代编程非常重要的部分,特别是在异步非阻塞的web、android中,处处有回调。而实现对web的回调,能够让我们仍然沿着delphi的框架编写程序而不必跨界跨域编程,跨界跨域是造成软件不稳定的补祸根。 如果您对该领域有研究,欢迎与我交流,谢谢! QQ:360825938 weixin;SXQWHXQ
----------------------------------------------
-
作者:
2022/1/16 21:50:39
1楼:
经过近千次的av和invalid pointer,终于实现了datasnap 对unigui的回调。 现在已经具备2大功能: 1、利用服务器向客户端发通知; 2、客户端之间的通信 通信之间的数据格式是json,由于从服务器推送的信息是TJsonValue,所以原则上可以传送文字、图片、格式文本,等等json支持的所有数据。 实现datasnap对unigui的回调,关键意义是服务器向客户端推送数据,这比用客户端向服务器轮询数据机制上要先进得多。同时,服务器调用客户端函数,客户端函数可以实现更强大的业务逻辑。
----------------------------------------------
-
作者:
2022/1/16 22:02:05
2楼:
实现datasnap 对unigui的回调,最关键的有两个主要问题: 一、如何在unigui中,从外部线程中获得当前用户sessionid? 直接在tdbxcallbakc的Execute函数中,是不能访问任何unigui元素的,但可以访问unisevvermodule: LSession := UniServerModule.GetSession(SessionName); 获得session就可以操作session的mainmodule和mainform,从而进一步操作其它web组件。 二、另一个更重要的问题是,如果刷新客户端? 通过回调函数,你可以获得服务器上推送来的json数据了,但这些数据只存在于session中,也就是存在于服务器,它并不会主动刷新客户端网页。 目前,暂时没有很好的办法,但可以用定时器将传过来的数据更新到客户端。 写出来,与同行者共勉,若无同行者,我独行,我独自欣赏这独特的美景。
----------------------------------------------
-
作者:
2022/1/17 8:02:49
3楼:
感谢楼主的分享,个人看法不如直接用webSokect实现消息收发,通知客户端访问接口.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
2022/1/17 9:26:53
4楼:
是的,websocket可以方便地实现web session间的交流。 做这个只是一种探索。 目前可以用不超过10条语句实现datasnap 对unigui的回调,目前的问题是退出unigui里会有一些小的内存泄漏,还不太好解决,这个可能是TDBXCallBack的问题
----------------------------------------------
-
作者:
2022/1/17 10:37:32
5楼:
How to get current "SESSION" on DataSnap server? 1) you can use the "TDSSessionManager" class-global on server: / Adding, Verifying, Getting, Removing a "var/value" in current user-session... if not TDSSessionManager.GetThreadSession.HasData('UserID') then begin TDSSessionManager.GetThreadSession.PutData('UserID', lUserID.ToString); // MyUserIDstring:= TDSSessionManager.GetThreadSession.GetData('UserID'); // TDSSessionManager.GetThreadSession.RemoveData('UserID') end; Using "TDSSessionManager" your "server" can store or manage any information about the user's current session! You can use in-memory or save in disk! you see? ---> TDSSessionManager.GetThreadSession.ID
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
2022/1/17 12:49:05
6楼:
楼上的大师,你可能没有理解我的用意。 你的代码是获得datasnap 的连接session,这个不难。 我现在的问题是,想在unigui的外部函数中获得当前unigui的unisessionID。 这个很难办的。当前的sessionid保存在数据,然后在外部函数中获得此id,这个不好做,因为你要脱离unigui环境操作数据库。
----------------------------------------------
-
作者:
2022/1/17 17:58:57
7楼:
找到一种更好的办法,无须在外部线程获取当前unisessionId。 只要在unigui的窗口建立TUniCallback的实例,然后在TUniCallback的Execute里接收回调传过来的值即可。这样也避免了复杂操作造成的内存泄漏。 现在,终于可以放心地在项目中使用datasnap对unigui\intraweg\tms web core的回调技术了。 由于datasnap 是EMB的推荐原生技术,而且全部是用ObjectPascal写成的,对delphi的兼容性和操作性是其它组件所不能比拟的,所有能够不使用Sgc WebSocket这类第三方组件就尽量不使用。 现在用jmeter放1000个线程,在线程里模拟发通知,看会不会堆积内存泄漏,表现非常好。
----------------------------------------------
-
作者:
2022/1/17 18:13:49
8楼:
EMB是一家令人敬佩的伟大的公司,那些留守在EMB的delphi精英,如果他们去google\MicroSoft,会获得更大的发展,他们坚守的是对delphi的初心和情怀。不是吗,用delphi的人,都是delphi情结的人。 EMB低调而深厚,它向市场提供强大的产品但从不张扬,让市场去探索、去开发、去验证产品的价值。这是家最不讲经济效益的公司,社会需要这种走原生技术路线的践行者。 感谢伟大的EMB,感谢伟大的delphi!
----------------------------------------------
-
作者:
2022/1/17 19:56:41
9楼:
Sorry, but the Google Translator maybe was not very well in these task. Anyway, I tried understand but not success.
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
2022/1/18 23:24:45
10楼:
还是有一个问题,如果用户直接关闭浏览器,datasnap并不能探知用户已经离线,这个时候如果对datansp进行了回调将发生错误。 只能退出unigui datasnap才能感知注册用户已经离线
----------------------------------------------
-
作者:
2022/1/20 13:00:58
11楼:
这个时候应该启用datasnap的keepalive功能,但好像启用后会影响unigui的session管理
----------------------------------------------
-