服务器与客户端回叫

服务器delphi数据DataSnapXE最近,学习XE6下的DataSnap回叫技术编译代码,体会如下:

第一篇 服务器与客户端回叫

从Delphi2010开始,DataSnap支持回叫(Call Back)机制。这样,在调用耗时较长的方法时,通过回叫机制,返回服务器进程或正在处理的目标对象。

一、客户端实现步骤
    在客户端声明TClientModule1的单元文件uClientModule中:
    1、声明一个从TDBXCallback继承下来的对象(用于回叫参数值),并实现复载的步骤。

type
  TInitCallback = class(TDBXCallback)
    function Execute(const Arg: TJSONValue): TJSONValue; override;
  end;

TProgCallback = class(TDBXCallback)
    function Execute(const Arg: TJSONValue): TJSONValue; override;
  end;

2、初始化创建该对象

Initialization      // 初始化 创建
  InitCallback := TInitCallback.Create;
  ProgCallback := TProgCallback.Create;

3、实现声明的方法

function TProgCallback.Execute(const Arg: TJSONValue): TJSONValue;
begin
  with MainFrm do
  begin
    ProgressBar1.Position  := TJSONNumber(Arg).AsInt;
    Button5.Enabled := (TJSONNumber(Arg).AsInt = ProgressBar1.Max);
  end;
  //刷新屏幕
  Application.ProcessMessages;
  Result := TJSONNull.Create;     // 回传Null值
end;

function TInitCallback.Execute(const Arg: TJSONValue): TJSONValue;
begin
  with MainFrm do
  begin
    ProgressBar1.Max := TJSONNumber(Arg).AsInt;
    ProgressBar1.Step := 5;
    Edit1.Text := ‘总时长:‘ + TJSONNumber(Arg).ToString + ‘秒‘;
    Button5.Enabled := False;
  end;
  Result := TJSONNull.Create;
end;

4、调用回叫方法
procedure TMainFrm.Button5Click(Sender: TObject);
begin
  ClientModule1.ServerMethods1Client.LongTimeRunFunc(InitCallback, ProgCallback);
end;

二、服务器端实现步骤
    在服务器端声明TServerMethods1的单元文件uServerMethods中:
    1、编写一个带回叫机制的方法
    在方法的形参中,带入客户端的回叫参数:

function TServerMethods1.LongTimeRunFunc(InitCallback, ProgCallback: TDBXCallback): boolean;
var Max: Integer;
    I: Integer;
begin
  Max := Random(120) + 1;
  InitCallback.Execute(TJSONNumber.Create(Max)).Free;   // 将Max值通过JSON格式,通过InitCallback执行回叫后,释放该对象
  for I := 0 to Max do
  begin
    ProgCallback.Execute(TJSONNumber.Create(I)).Free;   // 将I值通过JSON格式,通过ProgCallback执行回叫后,释放该对象
    sleep(1000);
  end;
  Result := True;
end;

2、声明该方法

public
    { Public declarations }
    function LongTimeRunFunc(InitCallback, ProgCallback: TDBXCallback): boolean;

三、客户端声明服务器端输入方法的对象
    服务器端声明的方法(对象),需要在客户端中声明,才能使得二者之间实现数据传递。
    1、执行服务器端程序。
    2、在客户端的ClientModule1的单元,通过鼠标右键点击SQLConnection1,选择“Generate DataSnap client classses”项目。

四、运行机制
    客户端声明的TProgCallback是继承TDBXCallback的对象,它复载虚方法Execute,在服务器端运行,接受一个TJSONValue的参数,并且回传一个TJSONValue的结果值。TDBXCallback的回叫机制很有意思:服务器端在回叫客户端的方法时,可以将需要回传缎带客户端的值或对象,以TJSONValue的形式,当作虚方法Execute的参数回传缎带客户端,而客户端的方法,在被回叫执行完毕后,也可以将执行结果,以TJSONValue的形式,回传给服务器端。

时间: 2024-08-24 13:37:04

服务器与客户端回叫的相关文章

Ubuntu ssh服务器和客户端的安装和使用

1. 安装服务器端 sudo apt-get install openssh-server 确认是否开启ssh ps -e| grep ssh 如果有sshd进程表示启动了. 配置文件 /etc/ssh/sshd_config 2. 启动.停止.重启 启动 sudo /etc/init.d/ssh start 停止 sudo /etc/init.d/ssh stop 重启 sudo /etc/init.d/ssh restart 退出ssh exit 3. 客户端登录 SecureCRT 5.1

Windows操作系统下搭建Git服务器和客户端。

本文将介绍如何在Windows操作系统下搭建Git服务器和客户端.服务器端采用的是Bonobo Git Server,一款用ASP.NET MVC开发的Git源代码管理工具,界面简洁,基于Web方式配置,简单易用.客户端是采用的TortoiseGit工具,UI操作,省去输入命令的麻烦,对于windows用户来说更易于使用. 所需软件: Git服务器端: BONOBO GIT SERVER,下载最新版:http://bonobogitserver.com/ Git客户端: msysgit,下载最新

yum介绍及 基于yum服务器和客户端例子

因为都知道安装linux软件包rpm 很好用:但是不能解决软件包的个别依赖关系:所以安装数据包时出现依赖时.yum到可以解决这类数据包依赖关系:而且还能便于管理大量数据包更新的问题:它的特点  .可以同时配置多个资源库(Repository) ,简洁的配置文件(/etc/yum.conf)  ,自动解决增加或删除rpm包时遇到的倚赖性问题,保持与RPM数据库的一致性这也是它的优势.因此解决数据包的依赖关系:也是基于服务器和客户端的一种应用. 首先呢 介绍一下YUM 的简单指令: yum info

python编写socket服务器和客户端

本次使用的主要模块是socket模块,在这个模块中可以找到socket()函数,该函数用于创建套接字对象.套接字也有自己的方法集,这些方法可以实现基于套接字的网络通信. socket()模块函数 要创建套接字,必须使用socket.socket()函数,语法如下: socket(socket_family,socket_type,protocol=0) 其中socket_family是AF_UNIX(基于文件)或AF_INET(面向网络),socket_type是SOCK_STREAM(TCP)

蓝懿IOS网络服务器与客户端

服务器和客户端 网络架构: CS:Client  Server :优势:用户体验度高  缺点:不能跨平台 BS:Browser Server:优势:跨平台,缺点:性能依赖于网速 长连接和短连接 长连接:保证数据的实时性 TCP协议:需要建立连接 保证数据安全  属于长连接 UDP协议:可以实现1对多(广播)传输效率高(因为不用建立连接)不能保证数据准确到达 Socket:是在TCP或UDP协议上所提供的数据传输的方法集 连接:请求响应式,大部分网络请求都是短连接 TTP ip:内网(局域网之内1

10、使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。 服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。

/**10.使用TCP协议完成一个客户端一个服务器.客户端从键盘输入读取一个字符串,发送到服务器. 服务器接收客户端发送的字符串,反转之后发回客户端.客户端接收并打印. * 客户端*/ import java.io.*; import java.net.*; public class Test10_Client { public static void main(String[] args) throws Exception { Socket s = new Socket("192.168.0.

Muduo网络库实战(二):实现服务器与客户端的连接

1. 方案的确定 1)基本需求 用户1000+, IO压力不大: 多个客户端打开网站,输入查询字符串strclient,发送给服务器=>服务器接收客户端发过来的数据并处理,将结果返回给客户端: 2)并发网络服务程序设计方案 详见:<Muduo_网络库使用手册>的1.6节-<详解Muduo多线程模型> @ muduo中TcpServer模式的选择:多线程模式 模式一:单线程,accept与TcpConnection用同一个线程做IO; 模式二:多线程,accept与EventL

SignalR实现服务器与客户端的实时通信

介绍SignalR ASP.NET SignalR 是一个为 ASP.NET 开发人员的库,简化了将实时 web 功能添加到应用程序的过程.实时Web功能使服务端代码推送内容到链接可客服端并立即应用成为可能,而不需要服务端等待客户端去请求数据. SignalR可用于任何你想添加实时Web功能到ASP.NET应用程序的情形,聊天室是一个常用的例子,用户可以刷新Web页面来获得新的数据,或者页面使用一个长轮询来取回数据,这都是SignalR可以应用的场景.比如说仪表盘和监视系统,实时游戏等. Sig

python web编程-CGI帮助web服务器处理客户端编程

这几篇博客均来自python核心编程 如果你有任何疑问,欢迎联系我或者仔细查看这本书的地20章 另外推荐下这本书,希望对学习python的同学有所帮助 概念预热 eb客户端通过url请求web服务器里的静态页面,但是要怎么做到洞察不同用户同的输入?比如说表单提交等来产生不同的返回结果呢 一个简单的思路是web服务器把这些请求提交给另外一个程序,它接受用户输入然后处理,根据输入生成一个静态的html文件交给web服务器 复杂上面这样的流程程序就是CGI,是单独出来的 创建HTML 的CGI 应用程