`
fw2003
  • 浏览: 79367 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

轻量级SOAP---PHPPRC实践(一)

    博客分类:
  • J2EE
阅读更多

  最近发现以前做的采用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才称得上是真正的"简单的""轻量的".

1
0
分享到:
评论
3 楼 fw2003 2010-01-20  
andot 写道
嗯,PHPRPC for java 还不算完美,我们现在出了 PHPRPC 的商业版(叫Hprose)。针对 PHPRPC for Java(还有其它一些语言比如 Delphi、C#、Obj-c)中一些问题,我们从本质上进行了重新设计和编码。for Java 的版本在性能有 10 倍的提高,易用性和稳定性也有非常明显的提高!所以,如果商业应用的话,推荐使用商业版的 Hprose。


呵呵,再次感谢耐心回复我的问题
有机会的话会用的
支持国产!
2 楼 andot 2010-01-19  
嗯,PHPRPC for java 还不算完美,我们现在出了 PHPRPC 的商业版(叫Hprose)。针对 PHPRPC for Java(还有其它一些语言比如 Delphi、C#、Obj-c)中一些问题,我们从本质上进行了重新设计和编码。for Java 的版本在性能有 10 倍的提高,易用性和稳定性也有非常明显的提高!所以,如果商业应用的话,推荐使用商业版的 Hprose。
1 楼 java1573 2010-01-08  
冯同志,文章写得很不错。

相关推荐

    麦肯锡-年月―中国xx集团战略咨询项目建议书.ppt

    麦肯锡-年月―中国xx集团战略咨询项目建议书.ppt

    廖倩5.14运营款.xlsx

    廖倩5.14运营款.xlsx

    setuptools-25.0.2-py2.py3-none-any.whl

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    全网第一个宝宝生活记录网站root ca

    全网第一个宝宝生活记录网站,帮我写一个网站介绍,网址 https://43.136.21.175/ ,二维码分享和登录,统计记录最近时间,功能很全很实用,手机和电脑都可以访问,手机浏览器可以生成快捷方式到桌面和App一样,点右上角可以打开菜单,里面我做了图表统计可以看每天的喂养次数哪些,我们一直在用,很方便的

    yes I can.mp3

    yes I can.mp3

    IMG20240426155740.jpg

    IMG20240426155740.jpg

    4-8.py

    4-8

    基于python的舞蹈视频推荐系统相关实验设计与实现

    【作品名称】:基于python的舞蹈视频推荐系统相关实验设计与实现 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:主要分为三个实验阶段,数据构建以及处理;召回阶段;排序阶段 数据构建 ####开发环境为:Windows10 + python3.8 本教程主要是针对B站舞蹈视频进行数据获取,数据来源于B站舞蹈区的中国舞和舞蹈教程两个板块,获取的视频日期为2021.08.01-2.21.12.31。主要分为五部分数据获取,每部分具体获取内容如下: 舞蹈信息表,这部分按月份进行获取,由于舞蹈教程较少,因此月份合并获取。最后将所有获取的数据整合成一张表。 舞蹈_用户交互表,这部分根据舞蹈信息表获取的视频url,获取评论区用户ID以及相关链接,并将label值设为1;为提高获取速度,将源表进行拆分,分为多张表在不同的代码以及IP环境中运行。 用户信息表,首先根据交互表的user_id获取user_id的集合,然后根据user_id获取用户的公开信息。 舞蹈封面,根据舞蹈信息表的pic的url获取封

    matlab机器人课程和书籍中的问题.zip

    matlab机器人课程和书籍中的问题.zip

    基于yolov8+pyqt5实现精美界面支持图片视频和摄像检测源码.zip

    基于yolov8+pyqt5实现精美界面支持图片视频和摄像检测源码.zip

    2-9.py

    2-9

    zigbee 简单控制LED灯状态

    zigbee 简单控制LED灯状态

    pytest-7.1.2-py3-none-any.whl

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    独立按键控制数码管显示0-F.zip

    独立按键控制数码管显示0-F.zip

    Scrapy-2.7.0.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    pytest-3.5.1.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    工具与方法工作手册.ppt

    工具与方法工作手册.ppt

    麦肯锡—xx数码公司发展战略咨询报告.ppt

    麦肯锡—xx数码公司发展战略咨询报告.ppt

    xx集团组织变革思路.ppt

    xx集团组织变革思路.ppt

Global site tag (gtag.js) - Google Analytics