浏览模式: 标准 | 列表

以前发布的 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

» 阅读全文

在最新发布的 PHPRPC 2.1-20060810 版本中,包含了 PHPRPC for Java 版本。

PHPRPC for Java 不但可以使用 Servlet 发布服务,还可以简单的使用 JSP 来发布服务,并且可以直接发布 Java 内置类的方法。它支持在 JavaScript 中以异步远程调用方式来调用服务器端到过程(就像 DWR),可以更轻松的实现 Ajax 编程,另外,PHPRPC 的 JavaScript 在无需服务器代理的情况下就可以实现跨域调用,这是 DWR 所不能及的。PHPRPC 还支持在其它语言中(如 PHP、ASP、.NET 和 Java 本身)来远程调用 PHPRPC for Java 服务器上的过程。当然 PHPRPC for Java 的客户端也可以调用任何语言实现的 PHPRPC 服务器上的过程。它不但支持简单的整数、实数、字符串等基本类型,而且支持数组和所有 Java 中可以序列化的对象的传递。另外,PHPRPC for Java 最重要的一点是,它支持加密传输,让你无需部署 https 也可以安全传输数据,轻而易举的就可以实现 Ajax 安全编程了!

特点先介绍这么多,其实还有好多,就不说了,先说安装吧。

安装:

安装很简单,首先当然是下载咯,http://www.coolcode.cn/show-206-1.html 这里提供了3个下载地址,其中 CoolCode.CN 下载的始终是最新版本,Live-Share 上是特定的版本,Sf.net 上有所有发布的版本,不过只有 2.1-20060810 及其之后的版本才含有 PHPRPC for Java,所以,下载最新版本就可以了。

下载之后解压缩,你会发现所有语言的版本都有,并且按目录存放的,如果要用它作 Java 的 Ajax 编程,只需要 Java 版本和 js 版本就可以了。

首先要编译 Java 版本,这里提供了两种编译方式,一种是直接使用 JDK 编译,另一种是用 ant 编译,这两种编译方式都很简单,如果没有安装 ant,但是配置好了 JDK 的运行环境的话,直接进入 java 目录,键入 make 就可以编译完成了,不过这种方式只能在 Windows 下编译,因为没有提供 Linux 版本的 shell 脚本。如果安装了 ant 的话,就用 ant 方式编译,从命令行窗口进入 java 目录,键入 ant 就编译完成了,编译之后就会生成一个 phprpc.jar 的包,这种方式生成的 jar 包比较小,在各种系统下都可以运行,不过需要安装 ant,但我想用 Java 开发程序的同志应该都会用 ant 的吧。

OK,现在有了 phprpc.jar,我们就可以用它来做点东西了。

使用:

先说如何建立一个 JSP 的 PHPRPC 服务器。

首先在 Tomcat(或者其它 J2EE 服务器) 的发布目录下,建立一个 WEB-INF 目录,在下面再建立一个 lib 目录,把 phprpc.jar 放在 lib 目录中就可以了。然后在发布目录下建立你要发布服务的 JSP 程序,文件名当然是任意的,这里我们就叫 server.jsp 吧:

<%@ page import="java.lang.*" %>
<%@
page import="org.phprpc.*" %>
<%
PHPRPCServer phprpc_server = new PHPRPCServer(request, response, session);
phprpc_server.add("min", Math.class);
phprpc_server.add(new String[] { "sin", "cos" }, Math.class);
phprpc_server.start();
%>

就这么简单,这样就可以通过 server.jsp 来把 java.lang.Math 类的 min,sin,cos 方法发布给客户端调用了。

如果你在浏览器里键入:http://localhost:8080/server.jsp ,回车之后看到:

phprpc_functions="YTozOntpOjA7czozOiJtaW4iO2k6MTtzOjM6InNpbiI7aToyO3M6MzoiY29zIjt9";

的话,就表示成功了。

下面我们来看一下如何在 html 中用 js 调用这个服务。

首先把 js\compress\full 目录下的 phprpc_client.js 包含到你的 html 页面里来,这个压缩版本已经包含了所有的依赖程序,所以,你可以单独把它复制到任何目录下使用。

下面来建立一个 Html 页面试试吧:

<html>
<head>
<script type="text/javascript" src="phprpc_client.js"></script>
</head>
<body>
 
min(
<input id="a" type="text" />, <input id="b" type="text" />) <input id="minbtn" type="button" value="=" /> <input id="c" type="text" />
 
<script type="text/javascript">
var a = document.getElementById("a");
var b = document.getElementById("b");
var c = document.getElementById("c");
 
phprpc_client.create('rpc_client');
 
rpc_client.use_service("http://localhost:8080/server.jsp");
 
document.getElementById("minbtn").onclick= function() {
    if (rpc_client.ready) {
        c.value = "loading...";
        rpc_client.min(Number(a.value), Number(b.value), function (result) {
            c.value = result;
        });
    }
    else {
        alert("RPC not ready, wait a moment, please!");
    }
}
</script>
</body>
</html>

OK,打开试试吧,这个就可以调用服务器端的 min 函数来进行计算了。

» 阅读全文

7月
07

PHPRPC_2.1-20060707 发布

经过半个月的开发与严格测试,PHPRPC_2.1-20060707 版终于发布了!

该版本修正了 xxtea.php 在 Linux 上的问题,该问题是由于在 Linux 上整数溢出处理方式不统一造成的。它使得 PHPRPC 的加密传输功能在某些 Linux 版本上不能正常工作。该问题目前已修正。

修正了 ASP 版本的 PHPRPC 服务器中返回的错误号格式不正确的问题,该问题会造成发生某些错误时不能被发现。该问题目前已修正。

这次更新的重点是增加了 PHPRPC for ASP.NET 服务器端。它功能强大且简单易用,它实现了 PHPRPC for PHP 服务器端的所有特征,包括引用参数传递、控制台输出重定向等功能。另外,它还增加了对重载方法的支持。 该 ASP.NET 版本以源代码形式提供,编译好的库文件 PHPRPC.dll 可以在 sample 中找到,但这个是用 .NET Framework SDK 2.0 编译的,如果需要在 1.0、1.1 或 Mono 上运行,需要自己重新编译。

该版本中还增加了 2 个 PHPRPC for ASP.NET 的例子。一个是简单的示例,另一个是通过 PHPRPC for ASP.NET 实现的安全的 Web Telnet 客户端,它充分显示了 PHPRPC for ASP.NET 的强大功能,这是我见过的唯一一个不需要客户端安装任何插件就可以使用的 Web Telnet 客户端,而且还带加密传输功能。尽管它目前对控制字符的显示支持还不够,但这个问题可能在以后会进行改进。

另外,该版本还增加了 .NET 版本的 keygen,可以用它来生成 keypair.php、keypair.js 和 KeyPair.cs,.NET 版本的 keygen 执行速度远远快于 PHP 版本。

同时,PHPRPC 用户指南也增加了 PHPRPC for ASP.NET 的内容。

下载:

» 阅读全文

经过 3 天的努力,终于把 ASP 的 PHPRPC 服务器和客户端写好了,为了充分利用已经写好的编码,ASP 的服务器和客户端都是用 JScript 实现的,里面调用了原来写好的 utf.js、base64.js、phpserializer.js、powmod.js 和 xxtea.js 这五个文件。ASP 版本的 PHPRPC 服务器和 PHP 版本的 PHPRPC 服务器端功能基本上一致,不过 ASP 版本的不支持输出重定向,也就是说如果远程函数中有用 Response.Write 输出的内容,在客户端是不能通过 output 参数得到的。这是由于 ASP 本身输出控制功能太弱造成的,另外,ASP 服务器端创建时,没有 debug 参数。ASP 服务器端发生的错误都是严重错误(没有警告和提示性错误)。ASP 客户端在初始化调用时,应使用绝对地址,而不能使用相对地址。

» 阅读全文

特性 PHPRPC JSON-RPC XML-RPC
序列化方式 PHP JSON XML
序列化正负无穷大 支持 不支持 不支持
非零基数组传递 支持 不支持 不支持
非连续下标数组传递 支持 不支持 不支持
关联下标数组传递 支持 不支持 不支持
递归结构数组传递 支持 不支持 不支持
递归结构对象传递 支持 不支持 不支持
对象所属类传递 支持 不支持 不支持
可变类型参数传递 支持 支持 不支持
变长参数传递 支持 支持 不支持
引用参数传递 支持 不支持 不支持
服务器端输出重定向 支持 不支持 不支持
服务器端错误重定向 支持 不支持 不支持
浏览器跨域调用支持 支持 不支持 不支持
网络负载
加密传输 内置
易用性 一般
阅读全文

» 阅读全文