在第一個簡單的例子,服務器返回給客戶端的是一個簡單的變量,但是在日常的應用中,往往需要給客戶端傳輸大量的數據,例如要
返回流,在kbmMW 里面返回流也是比較方便的,下面我們就以給客戶端返回一個照片為例,說明一下。
還是在上次的例子服務里面,我們添加一下這個功能,首先要定義服務函數處理:
function Performgetimg(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant; virtual;
然后把函數名與處理過程在服務里面對應起來:
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)
else if AFunc='GETIMG' then
Result:=Performgetimg(ClientIdent,Args)
end;
最后就是函數處理的具體實現:
function Txalionsrv.Performgetimg(ClientIdent: TkbmMWClientIdentity;
const Args: array of Variant): Variant;
var
fs:Tfilestream;
begin
try
if not FileExists('D:\picture\'+args[1]) then
begin
kbmMWRaiseServerException('文件不存在!');
exit;
end;
fs:=Tfilestream.Create('D:\picture\'+args[1]);
ResultStream.LoadFromStream(fs);
finally
fs.Free;
end;
end;
好了,服務器端就完成了,可以編譯運行了。
現在來處理客戶端,在客戶端form 上放一個button 和image 控件,如圖:
並輸入按鈕點擊事件:
procedure TForm2.Button2Click(Sender: TObject);
var
args:array[1..4] of Variant;
ms:TMemoryStream;
begin
args[1]:='1.JPG';
kbmMWSimpleClient1.Request('xalion_srv','','getimg',args);
kbmMWSimpleClient1.ResultStream.SaveToFile('c:\1.jpg');
Image1.Picture.LoadFromFile('c:\1.jpg');
end;
ok 同時運行服務器和客戶端程序,我們就可以從服務器上下載照片流,並在客戶端顯示了。
存補:2013.12.09
如果不想在客戶端機器上使用臨時文件,可以直接用流,但是需要知道圖片格式
procedure TForm1.Button1Click(Sender: TObject); begin var args:array[1..4] of Variant; NewG: TJPEGImage; begin args[1]:='1.JPG'; kbmMWSimpleClient1.Request('xalion_srv','','getimg',args); newg:=TJPEGImage.Create; newg.LoadFromStream(kbmMWSimpleClient1.ResultStream); image1.Picture.Graphic.Free; image1.Picture.Graphic:=newg; end;