最近发现以前做的采用FLEX前台通过HTTPSERVICE方式与JAVA后台交互的方式在使用LR进行测试时负载敏感很高.之前选择HTTPSERVICE的原因第1是因为很熟悉,服务器端的代码相当于传统的AJAX应用,第2是因为考虑到BlazeDS的Remote Object方式的话配置很麻烦,虽然今后只需要维护后台的java对象结构,但是对于其他接入方式支持不了,同时也限制了界面的显示方式.所以就算早知道HTTPSERVICE性能一般也将就着用了.现在看来不得不考虑其他的PRC组件,在网上搜索了一下,找到了个叫做PHPRPC的东东.回忆起来,好象以前表弟说过他们用PHP+FLEX做WEBGAME的时候使用的就是这个东西.只不过一听名字就知道是PHP的没注意.稍微看了下,已经发展到3.0版本,支持10几种主流语言.(http://www.phprpc.org/zh_CN/) OK,谁叫它起这么个死板的名字,不过好象一开始就是针对PHP的....
不用不知道,一用真奇妙!从查看资料到下载到最后完成与JAVA/JS/FLEX客户端的交互,总共花了1个小时!OMG,自认自己资质一般,只能说明这个东东简直太神奇太简单了...所以就写下自己的一些心得与大家分享.
首先,到http://www.phprpc.org/zh_CN/download/下载3个版本,分别是对应JAVA/JS/AS3.0的支持.
解压JAVA版本,找到其中的一个make.bat的批处理文件,运行后则自动将源码编译打成JAR包,然后将phprpc.jar添加进项目的构建路径.这样JAVA客户端的环境就完成了.下面开始编写并发布服务.
首先我们按照习惯编写一个业务接口和实现类
package service; import model.User; public interface TestService { public String sayHello(String name); public void sayGoodBye(); public void showUser(User u); public User getUser(); }
package service; import model.User; public class TestServiceImpl implements TestService { public String sayHello(String name) { return "hello,"+name; } public void sayGoodBye() { System.out.println("bye bye"); } public void showUser(User u) { System.out.println(u.getName()+" "+u.getPassword()); } public User getUser() { User u = new User(); u.setName("jr"); u.setPassword("123"); System.out.println("invoke getUser()"); return u; } }
4个方法,分别做了简单的预定义类型和自定义类型地测试,User代码如下
package model; import java.io.Serializable; public class User implements Serializable{ public User(){ } String name; String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
需要注意的是,如果想要在客户端接收User对象的话,必须实现序列化接口.(接口,序列化 一看就晓得是远程调用^_^).
接下来我使用一个SERVLET来发布服务,当然你也可以简单地使用一个JSP.
public class TestAction extends BaseAction { public void test(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{ PHPRPC_Server ps = new PHPRPC_Server(); TestService testService = new TestServiceImpl(); //发布服务 注册TestService接口中的sayGoodBye sayHello showUser getUser4个方法 ps.add(new String[]{"sayGoodBye","sayHello","showUser","getUser"},testService); ps.start(request, response); } }
BaseAction以及web.xml的配置不再多说废话了,总之这个SERVLET的url-pattern为/t.do,即访问它的URL为http://主机:port/应用程序名/t.do?m=test
我们先用JAVA来充当客户端调用
package client; import org.phprpc.PHPRPC_Client; import service.TestService; public class JAVAClient { static final String URL = "http://localhost:8888/t/t.do?m=test"; /** * @param args */ public static void main(String[] args) { PHPRPC_Client client = new PHPRPC_Client(URL); TestService testService = (TestService) client.useService(TestService.class); System.out.println(testService.sayHello("fw")); testService.sayGoodBye(); } }
成功地话应该在控制台看到"hello,fw"以及"bye bye".
OK,接下来是JS中的使用,请大家注意和传统的AJAX以及DWR比较.
首先将之前下载的对应JS版本的压缩包解压,找到4个JS文件并在页面上引入,分别是phprpc_client.js,xxtea.js,bigint.js,phpserializer.js,base64.js,utf.js.
JS代码如下
<script type="text/javascript"> var URL = "http://localhost:8888/t/t.do?m=test";//引用服务的URL //按扭事件 function t(){ var info = document.getElementById("info"); var rpc_client = new PHPRPC_Client(URL,["sayHello","sayGoodBye","showUser","getUser"]); //调用sayHello rpc_client.sayHello("fw",function(result){ info.innerHTML=result; }); rpc_client.sayGoodBye();//调用sayGoodBye //调用showUser 参数为一个json格式的User对象 会自动转换 var user = {name:"fw",password:"123"}; rpc_client.showUser(user); //调用getUser rpc_client.getUser(function(result, args, output, warning){ alert(result.name); }); } </script>
是不是觉得和DWR很相似?但是不要忘了自始自终我除了拷贝1个JAR和几个js文件外,没有做任何地配置.比起DWR,WEBSERVICE来说PHPRPC具备几个优势:
1.使用,部署简单,只需要几个JAR或JS文件,无需配置
2.常用API非常简单
3.JAVA对象--JS对象--AS对象之间相互转换无需做任何配置
4.传输性能高效(http://www.iteye.com:80/topic/333720)
一句话,用起来非常地爽!比起所谓的SOAP,我认为PHPRPC才称得上是真正的"简单的""轻量的".