浏览模式: 标准 | 列表
1月
08

PHPRPC 3.0 for ASP 发布

Beta 2:

修正了客户端得到返回错误结果时为 undefined 的 bug。
增加了服务器端输出重定向功能的支持。

Beta 1:

实现了 PHPRPC 3.0 协议升级描述中的内容。
实现了 PHPRPC 3.0 for ASP API Draft 中的所有接口。

下载地址请访问 PHPRPC 官方网站:http://www.phprpc.org

» 阅读全文

12月
14

Flash 照相 PHPRPC 上传

先给大家看个小例子:http://www.phprpc.org/samples/takePhoto/

用 Flash 照相很容易,但是最好是先将它编码为 JPEG 格式在上传比较节省带宽。网上已经有了 JPEG 编码的 AS3 类,不过需要修改才能使用。修改后的代码我会附到该文最后。

嗯,其实这不是重点,下面才是重点,因为在 Flash9 中我不知道怎么用 AS3 弹出提示框,Flash9 中的 AS3 控件太少了。没办法我最后用的是 Flash 跟 javascript 交互的方式来实现照相上传的。而 javascript 在这里唯一做的事情就是触发照相上传事件和显示上传后的返回信息。如果你打算完全用 Flex 来做,也许根本不需要这么麻烦。

先来看 Flash 怎么做吧。首先拖两个 UILoader 控件到 Flash 的第一帧中,大小设置为你要照的照片的大小,这两个 UILoader 是后面用来放摄像头视频和照片用的。我设置的大小是 120×160。

» 阅读全文

Google 出来 Android 已经有一段时间了,昨天晚上下来玩了一下,还不错,不过找到一些 Android 上的 Java bug,其中最大的一个是 java.lang.reflect.Proxy 的 bug,它的 newProxyInstance 方法和 getProxyClass 方法,不论带入的 interfaces 是否是空,都会抛出 NullPointerException 错误,同样的调用方式在 PC 的 JDK 1.4、1.5 和 6.0 就完全正常。这个 bug 昨天提交到 Android 的讨论组了,不过他们什么时候能够修正这个 bug 就不知道了。当然,因为这个原因,PHPRPC 在开发 Android 应用程序时,暂时无法使用定义代理类接口,并通过代理类进行远程调用。但是仍然可以通过 PHPRPC_Client 对象的 invoke 方法来进行远程调用,下面是实例代码:

Java代码
  1. package com.google.android.hello;  
  2.    
  3. import org.phprpc.PHPRPC_Client;  
  4. import org.phprpc.util.Cast;  
  5.    
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.widget.TextView;  
  9.    
  10. public class HelloPHPRPC extends Activity {  
  11.     @Override  
  12.     public void onCreate(Bundle icicle) {  
  13.         super.onCreate(icicle);  
  14.         PHPRPC_Client client = new PHPRPC_Client("http://www.phprpc.org/server.php");  
  15.         client.setEncryptMode(2);  
  16. /* 
  17.         TextView tv1 = new TextView(this); 
  18.         tv1.setText(client.invoke("add", new Object[] { 1, 2 }).toString()); 
  19.         setContentView(tv1); 
  20. */  
  21.         TextView tv2 = new TextView(this);  
  22.         tv2.setText(Cast.toString(client.invoke("hello"new Object[] {"PHPRPC"})));  
  23.         setContentView(tv2);  
  24.     }  
  25. }  

下面是一个例子运行截图:

上面注释掉的语句也是可以正常执行的,注释掉是因为后面的执行会覆盖前面执行的结果。invoke 方式进行远程调用,只有一点需要注意,就是返回结果如果是字符串,那么需要用 Cast.toString 转化为字符串,因为字符串默认反序列化为字节数组,如果是其它类型,需要用 Cast.cast 方法来转成相应的类型,否则可能跟你预期的类型可能不一致,因为默认会返回最接近返回值的相容类型。

有了上面的例子和讲解,我想大家用 PHPRPC 来开发 Android 应用程序就没有什么问题了!

» 阅读全文

以前发布的 PHPRPC 3.0 的 JavaScript 客户端 是通过 script 标签来支持跨域调用的,因此限制了参数的长度不可能太长,并且如果页面不是 UTF-8 编码时,也不能跟服务器进行交互,原因是 script 没办法指定单独的 HTTP 头。前些日子发布的 ActionScript 3.0 版本的 PHPRPC 3.0 客户端是 通过 POST 来提交数据的,Flash 的跨域调用机制跟浏览器中的 XMLHTTPRequest 对象的跨域机制不同,Flash 的跨域调用限制可以通过在服务器端部署一个 crossdomain.xml 文件来进行限制。因此 ActionScript 3.0 版本的 PHPRPC 3.0 客户端是可以跨域的,而且服务器端还可以限制跨域的条件。前几天有位朋友建议我 给 JavaScript 跨域调用增加无参数长度限制的能力,他给出的方案是对 GET 请求分包传送,不过因为这种方法需要修改 PHPRPC 协议,目前的客户端和服务器端实现也都要作出修改才可以支持,而且就算实现了效率方面也不会很高,因此我突发奇想,如果在 JavaScript 中调用 Flash 的 ActionScript 3.0 的 PHPRPC 3.0 客户端不就既可以支持跨域,又没有参数长度限制了吗?而且因为 ActionScript 3.0 的执行效率比 JavaScript 高,所以,加密传输也会更快!ActionScript 3.0 里面跟服务器端交互是单独指定的 HTTP 头,因此也不会有页面非 UTF-8 编码时不能跟服务器交互数据的问题了。

于是,花了 2 天时间终于搞了一个跟原来 JavaScript PHPRPC 3.0 客户端使用方法相同的通过 ActionScript 3.0 跟 JavaScript 交互来实现的支持跨域无参数长度限制的 JavaScript PHPRPC 3.0 客户端。实现中当然遇到了一些问题,不过我单独写了一篇关于这些问题和解决办法帖子,这里就不罗嗦了。下面说一下这个 JavaScript PHPRPC 3.0 客户端跟原来的那个有什么不同之处:

1、新的这个 JavaScript 客户端需要在 HTML 的 body 插入 phprpc_flash.js 脚本(通过 script 标签来引入该文件),这段脚本不能放在 head 中,也不能放在 form 中。另外,要保证 phprpc_flash.js 中引用的 phprpc_client.swf 文件的路径是正确的。

2、都支持目前常见的浏览器,如:IE, Mozilla/Firefox,Opera,Safari 等。但是在非跨域的情况下,原来的 JavaScript 客户端对手持设备(例如 Pocket PC,SmartPhone,iphone 等)支持的更好,而新的这个 JavaScript 客户端因为需要 Flash9 的支持,在目前的手持设备上都不支持。

3、新的这个 JavaScript 客户端不支持 abort、setTimeout 和 getTimeout 这三个方法。因为在 ActionScript 3.0 版本的 PHPRPC 客户端里面也没有提供这三个方法。不过还好,这三个方法都是不常用。

4、在 JavaScript 中定义的对象,通过这个客户端传给服务器时,可能会变成 Hash 表(比如 PHP 中的 Array,Java 中的 HashMap,.NET 中的 HashTable),因为 JavaScript 跟 ActionScript 3.0 交互时,会在内部进行一次序列化和反序列化(Flash 本身处理的,而不是 PHPRPC 的序列化和反序列化)。

5、JavaScript 中的递归定义的对象,无法通过该客户端跟服务器通信,原因同第 4 条。因为 Flash 内部的这种 JavaScript 跟 ActionScript 3.0 之间的序列化和反序列化不支持递归对象。

今天把整个代码重写了一下,这次只使用 AS3 中的 URLLoader 来实现 POST 数据,而不再直接使用 AS3 版本的 PHPRPC 客户端,并且在非跨域情况下,仍然使用 XMLHttpRequest 来提交数据,因此,原来列举的上面那些不同的问题,除了第一条之外,2、3、4、5 都已经解决,跟原来的纯 JavaScript 版本完全一致了。

下载地址请访问 PHPRPC 官方网站:http://www.phprpc.org

» 阅读全文

11月
12

PHPRPC Client 3.0 for Perl

这个 PHPRPC 客户端程序支持加密传输,引用参数传递等诸多特征,跟 PHP 版本的客户端的使用方法基本相同。不过因为 PHP 序列化反序列化的包用的是 CPAN 的 PHP::Serialization 这个包,这个包的实现本身有一些问题,比如对负数的反序列化错误,不支持递归引用的序列化和反序列化等,因此,对于某些调用可能会失败,等以后把 PHP::Serialization 完善一下就可以解决了。

PHPRPC Client 3.0 for Perl

不过暂时不再搞 Perl 版本了,接下来改继续做 PHPRPC 3.0 for .NET 啦,好多人都在等待,我都有点不好意思说了。

» 阅读全文