`
neo
  • 浏览: 265554 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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 字符串。

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

相关推荐

    phprpc_3.0_delphi.zip_Free!_PHPRPC delp_PHPRPC for delp_delphi

    PHPRPC for Delphi 是针对 Delphi 6 - 2009 原生程序开发版本的。如果你想将 PHPRPC 用于 Delphi.NET,请参见 PHPRPC for .NET 章节的相关内容。 PHPRPC for Delphi 的安装 PHPRPC for Delphi 客户端 PHPRPC for ...

    phprpc_3.0.1_delphi

    1. **Library Files**: Delphi编译的动态链接库(DLL)或静态链接库(LIB),用于在Delphi项目中导入和使用Phprpc功能。 2. **Header Files**: 定义了接口和数据结构的头文件(.h或.pas),方便开发者在Delphi代码中...

    phprpc for java 服务器实例

    在本实例中,我们将深入探讨如何在Java环境中设置和使用Phprpc服务器,以便理解其核心概念和操作流程。 1. **Phprpc简介** Phprpc是一种高效、轻量级的RPC解决方案,它支持多种编程语言,包括PHP和Java。通过这个...

    phprpc for .net

    phprpc for .net 源代码都有,可修改

    phprpc_3.0.2_delphi_Edit_XE2

    在使用"phprpc_3.0.2_delphi_Edit_XE2"时,开发者需要将提供的库文件集成到Delphi XE2项目中,并按照Phprpc的文档指示配置客户端和服务端。然后,他们就可以在Delphi的代码中调用PHP服务,或者在PHP脚本中调用Delphi...

    PHPRPC与java交互实例

    学习PHPRPC与java交互的例子,是初学者最后的web项目学习实例。

    JSON-RPC for Java使用说明.doc

    JSON-RPC for Java 使用说明 JSON-RPC(JavaScript Remote Procedure Call)是一种轻量级的远程过程调用(RPC)协议,允许在不同语言和平台之间进行数据交换。以下是 JSON-RPC for Java 使用说明的知识点总结: ...

    PHPRPC3.0分享

    RPC框架的一个显著特点是其跨语言的能力,这表明PHPRPC3.0不仅限于PHP,还支持ASP、Delphi、Java、ActionScript 2、ActionScript 3等多种语言。这意味着开发者可以利用他们熟悉的语言来实现远程调用,大大提高了灵活...

    delphi与JSP通过xml-rpc协议交换数据的例子.rar_delphi XML_delphi jsp_delphi rp

    - 在这个例子中,开发者可能使用了 `XML-RPC for Delphi` 库,该库提供了易于使用的组件如 `TXMLRPCClient` 和 `TXMLRPCServer`,它们简化了调用和响应处理。 3. **JSP与XML-RPC** - JSP(Java Server Pages)是...

    JSON-RPC for Java使用说明

    JSON-RPC(JavaScript Object Notation Remote ...总之,JSON-RPC for Java提供了在Java环境中使用JSON进行远程调用的能力,通过学习和实践提供的文档和示例,你可以掌握如何在自己的项目中有效地应用JSON-RPC技术。

    PHPRPC .Net服务端+客户端

    标签中的"PHPRPC For ."可能表示这个版本是专门为.NET环境设计的,这意味着它可以与其他.NET语言(如C#、VB.NET等)无缝集成。 在实际应用中,PHPRPC可以用于以下场景: 1. **混合架构**:在PHP和.NET项目并存的...

    解决Delphi XML-RPC 中文乱码、结构/数组等没有解析I4项BUG

    最近要用XML-RPC机制实现delphi程序与Qt程序之间的通信,从...下载Delphi XML-RPC 后发现中文字符串会出现乱码,跟踪代码后发现XML-RPC默认的 字符编码是UTF-8,而且QT也都是用UTF-8编程,故把传输字符串改为UTF-8就行了。

    phprpc例子

    这个例子提供了关于如何使用Phprpc的详细说明。通过分析这个压缩包中的"phprpctest",我们可以深入理解Phprpc的工作原理、配置以及实际应用。 Phprpc的核心思想是使不同进程间能够调用彼此的方法,就像在同一个程序...

    php rpc远程过程调用

    - **README**:通常包含项目概述、安装说明、使用示例等,帮助用户快速了解和开始使用PHPRPC。 - **php**:可能包含PHPRPC的源代码文件,包括客户端和服务端的类库,以及示例代码。 总的来说,PHPRPC是一个强大的...

    phprpc调用示例

    phprpc 的delphi调用 一般常用的调用方法 htdocs http://127.0.0.1/ 为WEB根目录 PHPRPC演示 php版本调用 http://127.0.0.1/demo-phpclient.php 调用demo-phpserver.php发布的HelloWorld()方法 demo1 ...

    基于IOCP的远程函数调用(RPC)

    通过使用Delphi的RPC库,开发者可以轻松地创建服务端和客户端,定义接口,实现跨进程甚至跨网络的函数调用。 **RPC项目创建步骤** 1. **服务端开发**:首先,在Delphi中创建一个新的服务项目,然后定义需要暴露的...

    java delphi 互相调用 xml-rpc实例

    在这个实例中,我们将探讨如何使用XML-RPC实现Java与Delphi之间的互相调用,以及提供的源码和可执行文件的用途。 1. **XML-RPC 简介**: XML-RPC基于HTTP协议,使用XML作为数据交换格式。它定义了一种标准的方法,...

    Raknet for Delphi 简单封装2

    在"Raknet for Delphi 简单封装2"中,相较于前一版,开发者warrially增加了更多内容,旨在进一步完善和优化Delphi环境下Raknet的使用体验。通过访问提供的链接...

Global site tag (gtag.js) - Google Analytics