`
huming
  • 浏览: 2067 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA服务器端采用PHPRPC与Flex客户端通信注意事项及说明

阅读更多
一、 服务器

(一)JAVA数据对像class代码如下:
package com.orm;
import java.io.Serializable;
public class MyGameServer implements Serializable 
{
	private String id;
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
}

编写注意事项:
1. 包名和类名要和客户端class文件要一致
2. 要继承Java.io.serializable接口
3. 发布的方法要使用public声明,变量部份同理

(二)发布PHPRPC_Server服务Servlet Class代码如下:
import org.phprpc.PHPRPC_Client;
import org.phprpc.PHPRPC_Error;
import com.myorm.MyGameServer;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException 
{
doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException 
{
	LoginAPI loginAPI = new LoginAPI();
	PHPRPC_Server loginServer = new PHPRPC_Server();
	
	loginServer.add(“playerLogin”,loginAPI);
	//loginServer.add(loginAPI);
	loginServer.start(request, response);
}

编写注意事项:
1. doGet/doPost完成一处即可,然后把另外一处请求指向到已写完代码的post或get请求里
2. 因PHPRPC内部没有做线程互斥处理,所以使用单个实例的PHPRPC_Server是不安全的,每次请求都要重新new一个实例出来处理请求,备注:线程安全问题在商业版的PHPRPC(商业版叫HPROSE)是有解决方案的,所以想要解决这个问题需要购买商业版软件
3. 为了避免每次都加载要发布的API方法,PHPRPC_Server可以使用方法addGlobal来发布API,不过根据我的理解每次请求都需要重新实例化PHPRPC_Server这个类,用不用addGlobal方法来发布API意义不大
4. 在示例里我发布了一个叫playerLogin的API,在客户端仍然采用这个方法名来调用服务器方法
5. 如果项目中有一个单独的API类发布所有API接口可以考虑采用注释部份代码,直接发布整个类给客户端去调用

(三)JAVA配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>LoginServerServlet</servlet-name>
    <servlet-class>com.servlet.LoginServerServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServerServlet</servlet-name>
    <url-pattern>/servlet/loginserver.do</url-pattern>
  </servlet-mapping>
</web-app>

1. Java服务器端配置文件,示例里只是把Servlet访问的URL改变了,其它都和普通的Servlet配置文件都一样

二、 客户端
(一)PHPRPC_Client程序代码
import org.phprpc.PHPRPC_Client;
import org.phprpc.PHPRPC_Error;
import com.orm.MyGameServer;
	        
public function OnClick():void
{
var client:PHPRPC_Client = new PHPRPC_Client('http://localhost:8080/server/servlet/loginserver.do', ['playerLogin']);
client.playerLogin(“123”,function (result:*,args:Array,output:*,warning:PHPRPC_Error):void
	{
		var myserver:MyGameServer = MyGameServer(result);
	      txtWelcome.text = myserver.Id;
	},true);
}


编写注意事项:
1. PHPRPC_Client实例,只需注意['playerLogin']与服务器端发布的API保持一致即可。
(1) 如果发布的是一个类,那么给改变一下代码,把接收到的对象强制转化成一个Class对象,然后再访问里面的Public方法和变量,这部份不给代码了,请参考PHPRPC编程手册
(2) 如果发布的是多个API方法就用豆号分隔['playerLogin',’otherMethod’]
2. “123”即为传到远程方法的参数,如果有远程方法有多个形参可以用逗号分隔传入,例如:”123”,456,”789”,….,这部份请注意远程方法的数据类型
3. function (result:*,args:Array,output:*,warning:PHPRPC_Error):void 这部份的写法基本固定,当初我就在这段代码上经历了N个小时debug,后来发现在output:参数里指定了数据类型为传过来的Class对象,所以代码怎么都跑不通,之后试着写成output:*,这样写最容易理解,而且不会出错,因为传过来的都是Object类型,然后在里面的程序再把Object强制转换成想要的数据类型就OK了

(二)客户端数据对象Class文件
package com.orm
{
	public dynamic class MyGameServer
	{
		public var id : String;
		public function get Id() : String 
		{
			return id;
		}
		public function set Id(id:String) : void
		{
			this.id = id;
		}
	}
}

编写注意事项:
1. 请注意com.orm要与服务器传过来的class文件的包名和类名保持一致
2. class的前缀必须使用dynamic修饰,表示这是一个动态Class文件
3. 要取回来的id字段,虽然在服务器端声明为Private类型,但是在客户端class里必须使用Public声明,否则会接不到结果,这部份应该和PHPRPC内部的序列化机制有关
4. get和set两个方法必须依照Flex程序的编写规则来写,就如上面例子中所展示一样

总结了使用PHPRPC中JAVA与Flex通讯各注意事项,如果依照以上编程方法,应该是不会再出任何问题的。因为这本来就是一个开源的东西,所以相关的文档和代码不是很全很细,通过我本人的经历写篇指引,希望后来的人可以少走一些弯路。同时也感谢PHPRPC的作者,他在编写程序方面给予一些技术指导,让我更快的完成了示例代码的调试工作,同时也感谢他提供了这么好用的通讯中间件,希望他的商业版可以卖的更好。

网络搜索关键字:  PHPRPC通讯, JAVA与Flex通讯, Flex程序通讯技术, JAVA复杂数据对象Flex, JAVA Class对象传输
示例环境软件版本:PHPRPC3.02, Flex 3.2, JDK1.5, MyEclipse 6.5GA, Tomcat 6.02
技术网址:www.phprpc.com

文档作者:Tomas Hu
编写日期:2010/1/15
联系方式:MSN:humingchina@msn.com
Email:     humingchina@gmail.com
分享到:
评论
4 楼 andot 2010-01-30  
huming 写道
每次PHPRPC_client对象都是一个新的实例,所以是否是静态方法意义并不大。


每次 new 一个 PHPRPC_Client 对象的开销不是很大,但是每次 add 方法时,会进行多次反射,这个比 new PHPRPC_Client 对象的开销要大的多,所以 addGlobal 对于提高效率是有效果的。只不过 addGlobal 发布的方法需要是线程安全的。

另外,有时候你所看到的显式的 new 对象开销并不一定大,但是调用一个普通的方法开销不一定小,因为你不能确定你调用的那个方法里面是不是隐式的 new 了大量的对象,或者做了大量开销较大的调用。
3 楼 huming 2010-01-30  
每次PHPRPC_client对象都是一个新的实例,所以是否是静态方法意义并不大。
2 楼 jeekchen 2010-01-19  
PHPRPC_Server的addGlobal是静态方法,还是有作用的吧?
1 楼 andot 2010-01-15  
huming 写道
3. function (result:*,args:Array,output:*,warning:PHPRPC_Error):void 这部份的写法基本固定,当初我就在这段代码上经历了N个小时debug,后来发现在output:参数里指定了数据类型为传过来的Class对象,所以代码怎么都跑不通,之后试着写成output:*,这样写最容易理解,而且不会出错,因为传过来的都是Object类型,然后在里面的程序再把Object强制转换成想要的数据类型就OK了


function (result:*,args:Array,output:*,warning:PHPRPC_Error):void


准确的写法是:

function (result:*,args:Array,output:String,warning:PHPRPC_Error):void


output 参数的类型是固定的,就是 String,这个不会变的。所以可以放心的写成 String,而不需要写成 *。该参数除了服务器是 PHP 的以外,一般用不到。

相关推荐

    Thrift Java 服务器 客户端通信

    它通过定义一种中间表示(IDL,Interface Description Language)来描述服务接口,然后自动生成相应的客户端和服务器端代码,使得开发者可以专注于业务逻辑,而无需关注底层通信细节。 在Java环境中,Thrift提供了...

    phprpc for java 服务器实例

    Phprpc是一个跨语言的远程过程调用(RPC)框架,它允许PHP和Java应用程序之间进行无缝通信。在本实例中,我们将深入探讨如何在Java环境中设置和使用Phprpc服务器,以便理解其核心概念和操作流程。 1. **Phprpc简介*...

    Linux:rpc客户端服务端通信

    linux rpc实现客户端、服务端通信,开两个终端窗口分别使用指令./test_server 和./test_client 127.0.0.1 即可

    XML-RPC+服务客户端通信+实战+Web服务应用

    XML-RPC基础概念 XML-RPC协议详解 XML-RPC与SOAP比较 XML-RPC数据类型 XML-RPC消息格式 XML-RPC错误处理机制 XML-RPC客户端开发 XML-RPC服务器端开发 ...XML-RPC实战:Java服务器端编程 XML-RPC实战:PHP集成案例

    PHPRPC .Net服务端+客户端

    PHPRPC .Net服务端与客户端是一套跨平台的远程过程调用(RPC)解决方案,专为.NET开发者设计,使得PHP和.NET应用之间能够高效、便捷地进行通信。这套工具集包含了服务端组件和客户端库,允许开发者在PHP环境中调用...

    jsonrpc:JSONRPC服务器和客户端

    在PHP中,JSONRPC允许开发者通过HTTP或WebSocket等传输协议来实现服务端与客户端之间的通信。这个“jsonrpc”项目可能是提供了一个用于创建和使用JSONRPC服务器和客户端的PHP库,其名为“jsonrpc-master”。 首先,...

    Java与Flex整合通信.docx

    - **RemoteObject**:在Flex客户端,RemoteObject组件用于调用Java后端的服务,它提供了一种透明的方式与服务器通信,如同调用本地函数一样。 - **Web容器配置**:在`web.xml`中配置BlazeDS的Servlet和监听器,确保...

    phprpc客户端文件

    这是一个PHPrpc客户端文件

    flex remoteObject封装后和java通信

    Flex RemoteObject组件是Flex客户端与服务器端服务进行通信的主要方式。它通过HTTP或HTTPS协议与服务器进行通信,并且支持多种传输协议,如HTTP、RTMP和WebSockets。RemoteObject能够调用服务器端的方法,将结果返回...

    C语言利用socket套接字实现客户端和服务器端TCP通信实例

    本篇将详细探讨如何利用C语言的socket套接字实现客户端和服务器端的TCP通信。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它通过三次握手建立连接,并在数据传输过程中进行确认和重传...

    phprpc_3.0.2_java,webservice

    - `src`目录:Java源代码,包括服务器端和服务客户端的实现。 - `lib`目录:可能包含必要的依赖库,如JSON处理库、HTTP通信库等。 - `docs`目录:可能有API文档和使用指南。 - `examples`目录:示例代码,帮助...

    rpc.rar_phprpc java

    在这个“rpc.rar_phprpc java”压缩包中,我们关注的是PHP与Java之间的RPC通信。PHPRPC是一个轻量级、高效且易于使用的跨语言RPC框架,支持PHP与Java之间的数据交互。 PHPRPC是为了解决PHP和Java之间进行远程调用的...

    RPC通信模型(java)

    在Java中实现RPC通信模型,通常涉及客户端、服务端、序列化和网络通信等多个环节。以下是对这个主题的详细阐述: 1. **RPC基本原理**: RPC使得客户端可以像调用本地方法一样调用远程服务器上的方法,隐藏了网络...

    flex与 java 通信常见错误

    ### Flex与Java通信常见错误分析 #### 一、Send Failed 错误 在Flex与Java进行通信时,可能会遇到如下的RPC Fault错误: ``` RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" ...

    java基于RPC框架的阶乘计算客户端与服务端

    本项目"java基于RPC框架的阶乘计算客户端与服务端"提供了一个完整的示例,帮助开发者理解如何在Java环境中实现RPC通信,并进行阶乘计算。 首先,我们要理解什么是阶乘计算。阶乘是一个数学概念,表示一个正整数n的...

    Java和Flex通过Blaze 通信

    BlazeDS是Adobe公司发布的一个开源项目,它的主要功能是为Java服务器和Flex客户端提供实时的双向通信。通过使用BlazeDS,开发者可以在后台Java应用程序和前台Flex界面之间轻松地传递数据,实现远程服务调用(Remote ...

    Flex和Java通信-blazeds

    综上所述,BlazeDS为Flex和Java之间的通信提供了一套强大且灵活的解决方案,它简化了富客户端与服务器端的交互,使得开发人员可以更专注于业务逻辑而不是底层通信细节。通过深入理解和熟练运用BlazeDS,开发者可以...

    Unity通信,服务器端与客户端的互传消息

    在Unity引擎中,游戏开发涉及多个平台,包括移动端和PC端,这往往需要客户端与服务器之间的有效通信。本文将深入探讨Unity中的网络通信机制,如何实现在服务器端和客户端之间互传消息,以及如何利用这一功能来实现...

    Flex调用Webservice及java程序

    - **BlazeDS**:BlazeDS是开源的,提供了一组Java服务器端组件,用于在Flex和Java之间实现AMF通信。我们可以在Java服务器端创建代理服务,并在Flex客户端通过`RemoteObject`类来调用这些服务。 - **LCDS**:Adobe...

Global site tag (gtag.js) - Google Analytics