浏览 3430 次
精华帖 (3) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-15
最后修改:2010-01-15
(一)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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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 的以外,一般用不到。 |
|
返回顶楼 | |
发表时间:2010-01-19
PHPRPC_Server的addGlobal是静态方法,还是有作用的吧?
|
|
返回顶楼 | |
发表时间:2010-01-30
每次PHPRPC_client对象都是一个新的实例,所以是否是静态方法意义并不大。
|
|
返回顶楼 | |
发表时间:2010-01-30
huming 写道 每次PHPRPC_client对象都是一个新的实例,所以是否是静态方法意义并不大。
每次 new 一个 PHPRPC_Client 对象的开销不是很大,但是每次 add 方法时,会进行多次反射,这个比 new PHPRPC_Client 对象的开销要大的多,所以 addGlobal 对于提高效率是有效果的。只不过 addGlobal 发布的方法需要是线程安全的。 另外,有时候你所看到的显式的 new 对象开销并不一定大,但是调用一个普通的方法开销不一定小,因为你不能确定你调用的那个方法里面是不是隐式的 new 了大量的对象,或者做了大量开销较大的调用。 |
|
返回顶楼 | |