kbmMW—制作一个简单服务
今天仿着delphi窑洞洞主的例子做一个kbmMW 简单服务,功能是客户端调用服务器端的过程,完成一个累加的功能,并且与洞主的内容作比较,看升级后kbmMW的异同。以下部分是洞主的内容。
环境:DelphiXE10.2.2+kbm5.02
首先我们建立一个空白的vclform 应用程序,并放置几个控件,如图所示:
其中有三个控件,一个kbmMWSever1,一个kbmMWTCPIPIndyServerTransport1,还有一个就是启动按钮。
对应的属性如下:(基本没有怎么设置,都是默认)
并设置kbmMWTCPIPIndyServerTransport 的bindings 的ip 为0.0.0.0,端口为3000。
ip为0.0.0.0代表侦听本机所有的ip 地址。
Server属性:kbmMWServer1。
然后点file->new->others...出现kbmMW service wizard。
点ok,就出现了kbmMW的服务向导。
选择simple service 。这就是制作一个简单服务的向导。新的版本是红圈圈出来的两个选项。指的是listBox里的内容要不要排序。默认是不排序,另一个是按描述的内容排序。点下一步。
输入服务名,这个必须要注意,以后所有的调用都需要,我们这里把服务命名为YRSrv。
现在只有一个版本,因此版本号可以随便写,但是注意,这个版本号要填写,我自己曾经乱写,并在后面设置的时候与这个版本号不一致,导致无法得到计算结果。点下一步
这里是可选的,为了以后方便,可以把服务的说明写在这里。后面几个也是可选页面。
下面到服务标志的选择,我们这里就使用默认的值,以后需要高级服务时,可以在设置其他项。
下一步
在这里,我们把要定义的函数名到右面的listbox 里面。点下一步,出现最后的界面:
点“绿勾”按钮后就完成这一系列向导操作。最后会显示一个新创建出来的窗口出来。
现在就生成了这个服务的代码,并将累加的代码加上:
unit Unit2;
// =========================================================================
// kbmMW - An advanced andextendable middleware framework.
// by Components4Developers(http://www.components4developers.com)
//
// Service generated by kbmMWservice wizard.
//
// INSTRUCTIONS FORREGISTRATION/USAGE
//-----------------------------------
// Please update the usesclause of the datamodule/form the TkbmMWServer is placed on by adding
// YourServiceUnitName to it.Eg.
//
// uses ...,kbmMWServer,YourServiceUnitName;
//
// Somewhere in yourapplication, make sure to register the serviceclass to the TkbmMWServerinstance. Eg.
//
// var
// sd:TkbmMWCustomServiceDefinition;
// ..
// sd:=kbmMWServer1.RegisterService(yourserviceclassname,false);
//
// Set the last parameter totrue if this is the default service.
//
{$I kbmMW.inc}
interface
uses
SysUtils,
{$ifdef LEVEL6}
Variants,
{$else}
Forms,
{$endif}
Classes,
kbmMWSecurity,
kbmMWServer,
kbmMWServiceUtils,
kbmMWGlobal;
type
TkbmMWSimpleService2 =class(TkbmMWSimpleService)
private
{ Private declarations }
protected
{ Protected declarations }
function ProcessRequest(const Func:string;const ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant;override;
functionPerformsumall(ClientIdent:TkbmMWClientIdentity; const Args:array ofVariant):Variant; virtual;
public
{ Public declarations }
{$IFNDEF CPP}class{$ENDIF}function GetPrefServiceName:string; override;
{$IFNDEF CPP}class{$ENDIF}function GetVersion:string; override;
{$IFNDEF CPP}class{$ENDIF}function GetAuthor:string; override;
{$IFNDEF CPP}class{$ENDIF}function GetAssistance:string; override;
{$IFNDEF CPP}class{$ENDIF}function GetSyntaxAbstract:string; override;
{$IFNDEF CPP}class{$ENDIF}function GetSyntaxDetails:string; override;
{$IFNDEF CPP}class{$ENDIF}function GetDescriptionAbstract:string; override;
{$IFNDEF CPP}class{$ENDIF}function GetDescriptionDetails:string; override;
{$IFNDEF CPP}class{$ENDIF} functionGetFlags:TkbmMWServiceFlags; override;
end;
implementation
uses kbmMWExceptions;
{$R *.dfm}
// Service definitions.
//---------------------
{$IFNDEF CPP}class{$ENDIF}function TkbmMWSimpleService2.GetPrefServiceName:string;
begin
Result:='YRSrv';
end;
{$IFNDEF CPP}class{$ENDIF}function TkbmMWSimpleService2.GetVersion:string;
begin
Result:='1.0';
end;
{$IFNDEF CPP}class{$ENDIF}function TkbmMWSimpleService2.GetAuthor:string;
begin
Result:='YRSrv';
end;
{$IFNDEF CPP}class{$ENDIF}function TkbmMWSimpleService2.GetAssistance:string;
begin
Result:='[email protected]';
end;
{$IFNDEF CPP}class{$ENDIF}function TkbmMWSimpleService2.GetSyntaxAbstract:string;
begin
Result:='sumall';
end;
{$IFNDEF CPP}class{$ENDIF} functionTkbmMWSimpleService2.GetSyntaxDetails:string;
begin
Result:='"sumall"';
end;
{$IFNDEF CPP}class{$ENDIF}function TkbmMWSimpleService2.GetDescriptionAbstract:string;
begin
Result:='这是一个返回累加值的服务。';
end;
{$IFNDEF CPP}class{$ENDIF} functionTkbmMWSimpleService2.GetDescriptionDetails:string;
begin
Result:='"在这里写这个服务的详细描述。"';
end;
{$IFNDEF CPP}class{$ENDIF}function TkbmMWSimpleService2.GetFlags:TkbmMWServiceFlags;
begin
Result:=[mwsfListed];
end;
// Master request processor.
//--------------------------
functionTkbmMWSimpleService2.ProcessRequest(const Func:string; constClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant;
var
AFunc:string;
begin
AFunc:=UpperCase(Func);
if AFunc='SUMALL' then
Result:=Performsumall(ClientIdent,Args)
else Result:=inheritedProcessRequest(Func,ClientIdent,Args);
end;
// Functions published by theservice.
//------------------------------------
function TkbmMWSimpleService2.Performsumall(ClientIdent:TkbmMWClientIdentity;const Args:array of Variant):Variant;
var
i:integer;
mysum:integer;
begin
// Enter code here to perform function sumall
mysum:=0;
for I := 1 to args[0] do
begin
mysum:=mysum+i;
end;
result:=mysum;
end;
end.
至此,我将整个工程分别保存为以下文件名:
工程文件名:YRSrvAppP
主窗体文件名:YRSrvAppU(主窗体名:YRSrvAppF)
简单服务器文件名:YRSrvSmSrvU(主窗体名:YRSrvSmSrvF)
现在回到我们的主界面,添加一下代码:
uses
YRSrvSmSrvU;//这是手动加入了简单服务器的引用
{$R *.dfm}
procedure TYRSrvAppF.FormCreate(Sender:TObject);
var
sd:TkbmMWCustomServiceDefinition;
begin
sd:=kbmMWServer1.RegisterService(TYRSrvSmSrvF,false); // 这里把我们生成的服务注册,以便服务器调用
end;
procedureTYRSrvAppF.sButton1Click(Sender: TObject);
begin
kbmMWServer1.Active:=True;
end;
ok,我们的服务器端就完成了,可以编译运行了。
现在我们来做客户端程序。客户端就很简单,界面如下图:
其中两个主要控件的属性设置如下:
按钮的代码如下:
procedureTForm1.sButton1Click(Sender: TObject);
var
args:array[0..1] of Variant; // 给服务器端的参数
v:Variant; // 服务器端返回的参数
begin
args[0]:=100;
v:=kbmMWSimpleClient1.Request('YRSrv','','SUMALL',args); // 调用远程服务
sMemo1.Lines.Add(v);
end;
运行结果为:
至此,kbmMW简单的远程服务就好了。