我们今天做一个kbmMW 简单服务,功能是客户端调用服务器端的过程,完成一个累加的功能。
首先我们建立一个空白的vcl form 应用程序,并放置几个控件,如图所示:
其中有三个控件,一个kbmMWSever1,一个kbmMWTCPIPIndyServerTransport1,还有一个就是启动按钮。
对应的属性如下:
并设置kbmMWTCPIPIndyServerTransport 的bindings 的ip 为0.0.0.0,端口为3000。
ip为0.0.0.0 代表侦听本机所有的ip 地址。
然后点file->new->others... 出现kbmMW service wizard.
点ok,就出现了kbmMW 丑陋的服务向导,
我们今天的任务很简单,选择simple service . 点下一步。
输入服务名,这个必须要注意,以后所有的调用都需要,我们这里把服务命名为xalion_srv.
现在只有一个版本,因此版本号可以随便写。点下一步
这里是可选的,为了以后方便,可以把服务的说明写在这里。后面几个也是可选页面
下面到服务标志的选择,我们这里就使用默认的值,以后需要高级服务时,可以在设置其他项。
下一步
在这里,我们把要定义的函数名到右面的listbox 里面。点下一步,出现最后的界面:
现在就生成了这个服务的代码:
{$I kbmMW.inc}
interface uses SysUtils, {$ifdef LEVEL6} Variants, {$else} Forms, {$endif} Classes, kbmMWSecurity, kbmMWServer, kbmMWServiceUtils, kbmMWGlobal;
type Txalionsrv = class(TkbmMWSimpleService) private { Private declarations } protected function ProcessRequest(const Func:string; const ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant; override; function Performsumall(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant; virtual; { Protected declarations } public { Public declarations } {$IFNDEF CPP}class{$ENDIF} function GetPrefServiceName:string; override; {$IFNDEF CPP}class{$ENDIF} function GetVersion:string; override; {$IFNDEF CPP}class{$ENDIF} function GetSyntaxAbstract:string; override; {$IFNDEF CPP}class{$ENDIF} function GetFlags:TkbmMWServiceFlags; override; end;
implementation
uses kbmMWExceptions;
{$R *.dfm}
// Service definitions. //---------------------
{$IFNDEF CPP}class{$ENDIF} function Txalionsrv.GetPrefServiceName:string; begin Result:='xalion_srv'; end;
{$IFNDEF CPP}class{$ENDIF} function Txalionsrv.GetVersion:string; begin Result:='1.0'; end;
function Txalionsrv.Performsumall(ClientIdent: TkbmMWClientIdentity; const Args: array of Variant): Variant; var i:integer; mysum:integer; begin mysum:=0; for I := 1 to args[0] do begin mysum:=mysum+i;
end; result:=mysum;
end;
function Txalionsrv.ProcessRequest(const Func: string; const ClientIdent: TkbmMWClientIdentity; const Args: array of Variant): Variant;
var AFunc:string; begin AFunc:=UpperCase(Func); if AFunc='SUMALL' then Result:=Performsumall(ClientIdent,Args) end;
{$IFNDEF CPP}class{$ENDIF} function Txalionsrv.GetSyntaxAbstract:string; begin Result:='sumall(n)'; end;
{$IFNDEF CPP}class{$ENDIF} function Txalionsrv.GetFlags:TkbmMWServiceFlags; begin Result:=[mwsfListed]; end;
现在回到我们的主界面,添加一下代码:
procedure TForm1.Button1Click(Sender: TObject); begin kbmMWServer1.Active:=True; end;
procedure TForm1.FormCreate(Sender: TObject); var sd:TkbmMWCustomServiceDefinition; begin sd:=kbmMWServer1.RegisterService(Txalionsrv,false); // 这里把我们生成的服务注册,以便服务器调用
end;
ok,我们的服务器端就完成了,可以编译运行了。
现在我们来做客户端程序。客户端就很简单,界面如下图:
其中两个控件的属性如下:
按钮的代码如下:
procedure TForm2.Button1Click(Sender: TObject); var args:array[0..1] of Variant; // 给服务器端的参数 v:Variant; // 服务器端返回的参数 begin args[0]:=100; v:=kbmMWSimpleClient1.Request('xalion_srv','','SUMALL',args); // 调用远程服务 memo1.Lines.Add(v);
end;
end.
运行结果为
好了,这个简单的远程服务就好了,还算简单吧。
|