使用delphi 开发多层应用(六)kbmMW返回流到客户端

简介: 在第一个简单的例子,服务器返回给客户端的是一个简单的变量,但是在日常的应用中,往往需要给客户端传输大量的数据,例如要 返回流,在kbmMW 里面返回流也是比较方便的,下面我们就以给客户端返回一个照片为例,说明一下。

   在第一个简单的例子,服务器返回给客户端的是一个简单的变量,但是在日常的应用中,往往需要给客户端传输大量的数据,例如要

返回流,在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;

 





目录
相关文章
|
JSON NoSQL Go
GoFrame gredis 硬核解析 | DoVar、Conn连接对象、自动序列化
详细的介绍了gredis的使用,包括:Do/DoVar方法的使用及区别、复杂场景下使用Conn方法从连接池中获取一个redis连接对象、当给定的参数为map, slice, struct时,gredis内部支持自动对其使用json序列化,并且读取数据时可使用gvar.Var的转换功能实现反序列化。
240 0
GoFrame gredis 硬核解析 | DoVar、Conn连接对象、自动序列化
VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
原文: VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法   1、提示:在VS2010,在引用COM组件的时候,出现了无法嵌入互操作类型“……”,请改用适用的接口的错误提示。
1056 0
|
数据安全/隐私保护
使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
从kbmmw 4.4 开始,增加了认证管理器,这个比原来的简单认证提供了更多的功能。细化了很多权限操作。 今天对这一块做个介绍。   要做一个认证管理,大概分为以下5步:        1.  定义你要保护的资源,一般是服务、函数,当然你只要不限麻烦,可以是任何东西;        2.  定义使用者(用户);        3.  定义角色,使用者通过角色与服务器打交道;        4.  定义角色或用户可以访问的资源(授权);        5. 定义认证与登录的限制(本步不是必须的)。
1013 0
|
Web App开发 JSON 数据库
使用delphi 开发多层应用(二十一)使用XE5 RESTClient 直接访问kbmmw 数据库
delphi XE5 出来了,增加了android 的开发支持,另外增加了一个RESTClient 来支持访问REST 服务器。 这个功能非常强大,可以直接使用非常多的REST 服务器。同时也可以支持访问kbmmw 的web 服务器, 并完美的通过JSON支持使用kbmmw 的JSON 数据格式。
1565 0
|
Android开发 iOS开发 网络架构
使用delphi 开发多层应用(二十) ios通过soap 显示kbmmw服务器上的图片
上一次通过soap,使IOS 访问了kbmmw服务器,今天顺便看能不能与android 共用服务器上的那个 下载图片的功能。首先说一下服务端的的程序,基本上就是前面的代码,没有变化,只是要indy 里面的 base64 编码功能,不再啰嗦,直接代码: function Txalionsrv.
1025 0