DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: webb123
今日帖子: 1
在线用户: 7
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
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
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2022/1/16 21:50:39
1楼: 经过近千次的av和invalid pointer,终于实现了datasnap 对unigui的回调。
现在已经具备2大功能:
1、利用服务器向客户端发通知;
2、客户端之间的通信
通信之间的数据格式是json,由于从服务器推送的信息是TJsonValue,所以原则上可以传送文字、图片、格式文本,等等json支持的所有数据。
实现datasnap对unigui的回调,关键意义是服务器向客户端推送数据,这比用客户端向服务器轮询数据机制上要先进得多。同时,服务器调用客户端函数,客户端函数可以实现更强大的业务逻辑。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
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中,也就是存在于服务器,它并不会主动刷新客户端网页。
目前,暂时没有很好的办法,但可以用定时器将传过来的数据更新到客户端。
写出来,与同行者共勉,若无同行者,我独行,我独自欣赏这独特的美景。
----------------------------------------------
-
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2022/1/17 8:02:49
3楼: 感谢楼主的分享,个人看法不如直接用webSokect实现消息收发,通知客户端访问接口.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2022/1/17 9:26:53
4楼: 是的,websocket可以方便地实现web session间的交流。
做这个只是一种探索。
目前可以用不超过10条语句实现datasnap 对unigui的回调,目前的问题是退出unigui里会有一些小的内存泄漏,还不太好解决,这个可能是TDBXCallBack的问题
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
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
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2022/1/17 12:49:05
6楼: 楼上的大师,你可能没有理解我的用意。
你的代码是获得datasnap 的连接session,这个不难。
我现在的问题是,想在unigui的外部函数中获得当前unigui的unisessionID。
这个很难办的。当前的sessionid保存在数据,然后在外部函数中获得此id,这个不好做,因为你要脱离unigui环境操作数据库。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
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个线程,在线程里模拟发通知,看会不会堆积内存泄漏,表现非常好。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2022/1/17 18:13:49
8楼: EMB是一家令人敬佩的伟大的公司,那些留守在EMB的delphi精英,如果他们去google\MicroSoft,会获得更大的发展,他们坚守的是对delphi的初心和情怀。不是吗,用delphi的人,都是delphi情结的人。
EMB低调而深厚,它向市场提供强大的产品但从不张扬,让市场去探索、去开发、去验证产品的价值。这是家最不讲经济效益的公司,社会需要这种走原生技术路线的践行者。
感谢伟大的EMB,感谢伟大的delphi!
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
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
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2022/1/18 23:24:45
10楼: 还是有一个问题,如果用户直接关闭浏览器,datasnap并不能探知用户已经离线,这个时候如果对datansp进行了回调将发生错误。 只能退出unigui datasnap才能感知注册用户已经离线
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2022/1/20 13:00:58
11楼: 这个时候应该启用datasnap的keepalive功能,但好像启用后会影响unigui的session管理
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行56.15234毫秒 RSS