文章来自于:http://blog.csdn.net/half1/article/details/21329785

本文将介绍Hprose for php客户端的更多细节。

1、直接通过远程方法名进行远程调用

在快速入门一章中,我们已经见识过这种方式的调用了,这里再来具一个例子来进行说明:

  1. <?php
  2. include("hprose/hproseHttpClient.php");
  3. $client = new HproseHttpClient("http://www.hprose.com/example/");
  4. echo "<pre>";
  5. echo $client->sum(1, 2, 3, 4, 5);
  6. echo "\r\n";
  7. echo $client->Sum(6.0, 7.0, 8.0);
  8. echo "\r\n";
  9. $userList = $client->getUserList();
  10. print_r($userList);
  11. echo "</pre>";
  12. ?>

从这个例子中,我们可以看出通过远程方法名进行调用时,远程方法名是不区分大小写的,所以不论是写sum还是Sum都可以正确调用,如果远程方法返回结果中包含有某个类的对象,而该类并没有在客户端明确定义的话,Hprose会自动帮你生成这个类的定义(例如上例中的User类),并返回这个类的对象。

2、通过Invoke方法进行远程调用

 

非引用参数传递

  1. <?php
  2. include("hprose/hproseHttpClient.php");
  3. $client = new HproseHttpClient("http://www.hprose.com/example/");
  4. echo "<pre>";
  5. $args = array(1, 2, 3, 4, 5);
  6. echo $client->invoke("sum", $args);
  7. echo "\r\n";
  8. $args = array(6.0, 7.0, 8.0);
  9. echo $client->invoke("Sum", $args);
  10. echo "\r\n";
  11. $userList = $client->invoke("getUserList");
  12. print_r($userList);
  13. echo "</pre>";
  14. ?>

运行结果与上面例子的运行结果完全相同。但是我们发现用invoke方法并不方便,因为当有参数时,必须要把参数单独放入一个变量中才可以进行传递。所以通常我们无需直接使用invoke方法,除非我们需要动态调用。另外,还有一种情况下,你会用到invoke方法,那就是在进行引用参数传递时。

引用参数传递

下面这个例子很好的说明了如何进行引用参数传递:

  1. <?php
  2. include("hprose/hproseHttpClient.php");
  3. $client = newHproseHttpClient("http://www.hprose.com/example/");
  4. echo"<pre>";
  5. $args =array(array("Mon"=>1,"Tue"=>2,"Wed"=>3,"Thu"=>4,"Fri"=>5,"Sat"=>6,"Sun"=>7));
  6. echo"args(before invoke):\r\n";
  7. print_r($args);
  8. $result =$client->invoke("swapKeyAndValue", $args, true);
  9. echo"args(after invoke):\r\n";
  10. print_r($args);
  11. echo"result:\r\n";
  12. print_r($result);
  13. echo"</pre>";
  14. ?>

我们看到运行前后,$args中的值已经改变了。

这里有一点要注意,当参数本身是数组时,该数组应该作为参数数组的第一个元素传递,否则程序将会出错,或者在调用中陷入等待状态,这样的错误不容易被找到,因此一定要注意这一点。

 

3、异常处理

Hprose for PHP的客户端只支持同步调用,因此在调用过程中,如果服务器端发生错误,异常将在客户端被直接抛出,使用try...catch语句块即可捕获异常,通常服务器端调用返回的异常是HproseException类型。但是在调用过程中也可能抛出其它类型的异常。

例如,当调用不存在的方法时:

  1. <?php
  2. include("hprose/hproseHttpClient.php");
  3. $client = new HproseHttpClient("http://www.hprose.com/example/");
  4. echo "<pre>";
  5. try {
  6. echo $client->unexistMethod();
  7. }
  8. catch (Exception $e) {
  9. print_r($e);
  10. }
  11. echo "</pre>";
  12. ?>

4、超时设置

Hprose 1.2 for PHP及其之后的版本中增加了超时设置。只需要设置客户端对象上的setTimeout属性即可,单位为毫秒。当调用超过timeout的时间后,调用将被中止。

 

5、HTTP参数设置

目前的版本只提供了http客户端实现,针对于http客户端,有一些特别的设置,例如代理服务器、http标头等设置,下面我们来分别介绍。

代理服务器

默认情况下,代理服务器是被禁用的。可以通过setProxy来设置http代理服务器的地址和端口。参数是字符串,例如:"tcp://10.54.1.39:8000",默认值为NULL。
 

HTTP标头

有时候您可能需要设置特殊的http标头,例如当您的服务器需要Basic认证的时候,您就需要提供一个Authorization标头。设置标头很简单,只需要调用setHeader方法就可以啦,该方法的第一个参数为标头名,第二个参数为标头值,这两个参数都是字符串型。如果将第二个参数设置为NULL,则表示删除这个标头。
标头名不可以为以下值:Context-Type、Context-Length、Host。

因为这些标头有特别意义,客户端会自动设定这些值。

另外,Cookie这个标头不要轻易去设置它,因为设置它会影响Cookie的自动处理,如果您的通讯中用到了Session,通过setHeader方法来设置Cookie标头,将会影响Session的正常工作。

6、保持会话

当浏览器访问一个PHP页面,而这个PHP页面又通过Hprose客户端去访问另一台Hprose服务器时,通常是不能保持浏览器到Hprose客户端访问的那台Hprose服务器会话的。那有什么办法能够将这个会话保持并传递到浏览器吗?

Hprose 1.2 for PHP中提供了这样的功能,只需要在使用客户端页面的开头如下调用就可以了。

  1. session_start();
  2. include("hproseHttpClient.php");
  3. HproseHttpClient::keepSession();
 

7、调用结果返回模式

有时候调用的结果需要缓存到文件或者数据库中,或者需要查看返回结果的原始内容。这时,单纯的普通结果返回模式就有些力不从心了。Hprose 1.3提供更多的结果返回模式,默认的返回模式是Normal,开发者可以根据自己的需要将结果返回模式设置为Serialized,Raw或者RawWithEndTag。

Serialized模式

Serialized模式下,结果以序列化模式返回,在PHP中,序列化的结果以String类型返回。用户可以通过HproseFormatter.unserialize方法来将该结果反序列化为普通模式的结果。因为该模式并不对结果直接反序列化,因此返回速度比普通模式更快。

在调用时,通过在回调方法参数之后,增加一个结果返回模式参数来设置结果的返回模式,结果返回模式是一个枚举值,它的有效值在HproseResultMode枚举中定义。

 

Raw模式

Raw模式下,返回结果的全部信息都以序列化模式返回,包括引用参数传递返回的参数列表,或者服务器端返回的出错信息。该模式比Serialized模式更快。
 

RawWithEndTag模式

完整的Hprose调用结果的原始内容中包含一个结束符,Raw模式下返回的结果不包含该结束符,而RawWithEndTag模式下,则包含该结束符。该模式是速度最快的。

这三种模式主要用于实现存储转发式的Hprose代理服务器时使用,可以有效提高Hprose代理服务器的运行效率。

转:Hprose for php(三)——客户端的更多相关文章

  1. PHP漏洞全解(三)-客户端脚本植入

    本文主要介绍针对PHP网站的客户端脚本植入攻击方式.所谓客户端脚本植入攻击,是指将可以执行的脚本插入到表单.图片.动画或超链接文字等对象内.当用户打开这些对象后,黑客所植入的脚本就会被执行,进而开始攻 ...

  2. 转:Hprose for php(一)——快速入门

    文章来自于:http://blog.csdn.net/half1/article/details/21095665 本文参考了Hprose官方的用户手册,Hprose官网:http://www.hpr ...

  3. 【基于WinForm+Access局域网共享数据库的项目总结】之篇三:Access远程连接数据库和窗体打包部署

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

  4. 循序渐进做项目系列(3):迷你QQ篇(1)——实现客户端互相聊天

    <循序渐进做项目系列迷你QQ篇>将陆续介绍客户端聊天,文件传输,加好友,群聊,包括语音聊天,视频聊天,远程桌面等等需求如何实现,感兴趣的朋友可以持续关注.考虑到某些需求较为复杂,本系列采用 ...

  5. THINKPHP中关于接口问题(客户端)

    一 apk版本号 客户端发送get请求访问服务器端的控制器方法,通过用户传过来的用户名和密码. 二  服务器端通过客户端传入的user and password 去数据库进行查询,Success就生成 ...

  6. 循序渐进做项目系列(4)迷你QQ篇(2)——视频聊天!(附源码)

    一·效果展示 源码派送:MiniQQ1.1 文字聊天的实现参见:循序渐进做项目系列(3):迷你QQ篇(1)——实现客户端互相聊天 二·服务端设计 对于实现视频聊天而言,服务端最核心的工作就是要构造多媒 ...

  7. C# Redis Server分布式缓存编程 --网络转载

    这篇文章我将介绍如果用最简洁的方式配置Redis Server, 以及如何使用C#和它交互编程 一. 背景介绍 Redis是最快的key-value分布式缓存之一 缺点: 没有本地数据缓冲, 目前还没 ...

  8. WebService基本概念及原理

    一.Web Service基本概念 WebService是一种跨编程语言和跨操作系统平台的远程调用技术.Web Service也叫XML Web Service WebService是一种可以接收从I ...

  9. Windows Azure Service Bus (6) 中继(Relay On) 使用VS2013开发Service Bus Relay On

    <Windows Azure Platform 系列文章目录> 注意:本文介绍的是国内由世纪互联运维的Windows Azure服务. 项目文件请在这里下载. 我们在使用Azure平台的时 ...

随机推荐

  1. 电商H5制作常使用的排版方式

    在很多电商网站或者APP中,经常会出现一些精美夺目的活动宣传海报,吸引着用户点击.购买.如今,电商们可以把海报搬到微信中,做出面向用户群大.传播快的H5制作.那么,制作电商H5制作时可以使用哪三种排版 ...

  2. 10th day

    貌似有几天没写博客了额.... 现在学习MySQL数据库,难度并不是很大,只是需要记忆的知识点比较多,好多语法之类的,比较容易混淆,而且老师讲课的速度还是蛮快的,虽然部分同学觉得听起来有点吃力,不过我 ...

  3. 全文检索luncence

    检索技术基本原理: 最主要的两点是  1.如何创建索引 2.如何查询.  分析需求: 好几篇文档,从这些文档找关键词,一种方式是顺序一个个遍历,加入这些文档量很多,就花费太长时间了,第二种是建立索引, ...

  4. android中Canvas使用drawBitmap绘制图片

    1.主要的绘制图片方法 //Bitmap:图片对象,left:偏移左边的位置,top: 偏移顶部的位置     drawBitmap(Bitmap bitmap, float left, float ...

  5. iOS开发系列之远程控制事件

    在今天的文章中还剩下最后一类事件:远程控制,远程控制事件这里主要说的就是耳机线控操作.在前面的事件列表中,大家可以看到在iOS中和远程控制事件有关的只有一个- (void)remoteControlR ...

  6. java中的泛型(转)

    什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...

  7. python之Lambda函数---笔记

    <Python3 程序开发指南> Lambda函数,是一个匿名函数,创建语法: lambda parameters:express parameters:可选,如果提供,通常是逗号分隔的变 ...

  8. Python多线程及其使用方法

    [Python之旅]第六篇(三):Python多线程及其使用方法   python 多线程 多线程使用方法 GIL 摘要: 1.Python中的多线程     执行一个程序,即在操作系统中开启了一个进 ...

  9. 如何开通www国际域名个人网站

    欢迎访问我的域名http://www.baiqiantao.xyz 一.准备知识 什么是域名? 所有以www开头的域名,就是国际域名:不以www开头的域名,都是为子域名. 域名都有后缀,后缀是有意义的 ...

  10. IOS 开发 【序】

    首先说说环境的搭建: 需要有一台搭载开发环境的电脑 其实简单的设备就行,不过好的设备会提高开发效率. 有了设备,剩下的就是需要集成开发环境. 去 app store 下载最新的 xcode. 安装上x ...