使用delphi 開發多層應用(五)第一個kbmMW 服務例子


 我們今天做一個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.

運行結果為

好了,這個簡單的遠程服務就好了,還算簡單吧。

 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM