PHPRPC for Delphi 使用实例解析

转自 http://coolcode.cn/?action=show&id=321

本文是针对 PHPRPC for Delphi 原生程序开发版本的介绍,如果您使用的是 .NET 版本可以忽略本文。

PHPRPC for Delphi 是以组件形式提供的,目前只提供了客户端组件,它是非可视化的组件,所以不论是在窗口程序还是控制台程序中你都可以使用它。

直接在 Delphi 中安装该组件包后就可以使用了,不过目前只提供了 Delphi 7 和 Delphi 2009 的组件安装包。如果你是用其它版本的 Delphi 可以通过自己创建组件包来安装,或者将现有版本的组件包转换为你所使用版本的组件包。

安装组件包非常简单。如果你是用的是 Delphi 7,打开 PHPRPC_D7.dpk 编译安装即可。如果你使用的是 Delphi 2009,打开 PHPRPC_D2009.dproj 编译安装即可。按照之后就可以直接从 Internet 面板上找到 PHPRPC_Client 组件了。

为了方便讲解,这里给出的演示是控制台程序:

Delphi/Pascal代码
00.program Example;   
01.   
02.{$APPTYPE CONSOLE}   
03.   
04.uses   
05.  PHPRPC;   
06.   
07.var   
08.  client: TPHPRPC_Client;   
09.  clientProxy: Variant;   
10.  intArray: array of Integer;   
11.  arraylist: TArrayList;   
12.  vhashmap: Variant;   
13.  ohashmap: THashMap;   
14.  i: Integer;   
15.begin   
16.  // 创建客户端对象,如果是图形界面程序,直接拖放组件到 Form 即可。 
17.  client := TPHPRPC_Client.Create;   
18.  // 返回远程代理对象,通过它就可以直接调用远程方法了。 
19.  // 因为实际上该代理对象是 client 对象的 Variant 包装,所以该代理对象不需要单独释放。   
20.  clientProxy := client.useService('http://localhost/index.aspx'); 
21. 
22.  // 设置交换密钥的长度(可选,默认 128) 
23.  client.KeyLength := 256; 
24.  // 设置加密模式(0 - 不加密、1 - 单向加密、2 - 双向加密、3 - 双向且输出加密),默认为 0 
25.  client.EncryptMode := 1; 
26.   
27.  // 数字参数   
28.  writeln(clientProxy.add(1, 2));   
29.   
30.  // 英文字符串参数   
31.  writeln(clientProxy.add('foo', 'bar'));   
32.   
33.  // Delphi 7 中文字符串参数要转换为UTF8编码   
34.  writeln(UTF8ToAnsi(clientProxy.Hello(AnsiToUTF8('马秉尧'))));   
35.   
36.  // Delphi 2009 中文字符串参数默认为UnicodeString   
37.  // writeln(UTF8ToAnsi(clientProxy.Hello('马秉尧')));   
38.   
39.  // 中文的服务器输出的也是UTF8编码,本地打印要转换为本地编码   
40.  writeln(UTF8ToAnsi(client.Output));   
41.   
42.  // 传递动态数组参数   
43.  setLength(intArray, 10);   
44.  // 主要不要越界   
45.  for i := 0 to 9 do intArray[i] := Random(100000);   
46.  // 返回值是 Variant 包装的 THashMap   
47.  vhashmap := clientProxy.sort(Variant(intArray));   
48.  // 这里不能用索引方式访问   
49.  for i := 0 to 9 do writeln(vhashmap.get(i));   
50.  writeln;   
51.  // 使用完之后释放掉, 以免造成内存泄漏   
52.  // 但动态数组不需要显式释放,它会在程序运行结束后自动释放   
53.  vhashmap.Free;   
54.   
55.  // 传递数组列表参数   
56.  // 注意这里初始化了10个元素的空间,但是实际用了11个元素   
57.  // 因为数组列表有自增长的特性,因此不会发生越界访问的情况   
58.  // 但上面的动态数组则不可以越界访问,否则会发生意想不到的错误   
59.  arraylist := TArrayList.Create(10);   
60.  for i := 0 to 10 do arraylist[i] := Random(100000);   
61.   
62.  vhashmap := clientProxy.sort(arraylist.ToVariant);   
63.  // 这里不能用索引方式访问   
64.  for i := 0 to 10 do writeln(vhashmap.get(i));   
65.  writeln;   
66.   
67.  // 可以显式通过 FromVariant 方法转换成 THashMap 对象   
68.  ohashmap := THashMap(THashMap.FromVariant(vhashmap));   
69.  // 这里不能用get方法访问   
70.  for i := 0 to 10 do writeln(ohashmap[i]);   
71.  writeln;   
72.   
73.  // 释放掉原来的未排序数组   
74.  arraylist.Free;   
75.   
76.  // 将返回结果转换为 TArrayList 类型   
77.  arraylist := ohashmap.ToArrayList;   
78.  for i := 0 to 10 do writeln(arraylist[i]);   
79.  writeln;   
80.   
81.  vhashmap.Free;   
82.  // vhashmap 释放后 ohashmap 也一起释放,反之亦然   
83.  // 因此下面注释掉的语句如果执行的话会出错(或让程序崩溃)   
84.  // for i := 0 to 10 do writeln(ohashmap[i]);   
85.   
86.  // 但通过 ToArrayList 转换得到的是新对象,所以仍然可以使用   
87.  for i := 0 to 10 do writeln(arraylist[i]);   
88.   
89.  // 因此不要忘记释放资源,以免造成内存泄漏   
90.  arraylist.Free;   
91.  client.Free;   
92.  readln; 
93.end.   
因为 Delphi 2009 中引入了 UnicodeString,所以不需要 AnsiToUTF8 就可以正确按照 UTF-8 编码来传输 string 了。上面的程序中关于中文字符串部分已经给出了在不同版本下的解决方案,但是 Delphi 7 的写法在 Delphi 2009 上也可以继续使用。不过目前的 PHP 4/5 还不支持 Delphi 中传输的 WideString 字符串,但将来的 PHP 6 会支持。目前其它所有语言的 PHPRPC 服务器都已经支持 Delphi 中传输的 WideString 字符串。

其它需要注意的问题都已经在注释中写清楚了,这里就不再重复了。

你可能感兴趣的:(PHP,.net,Delphi,pascal,phprpc)