加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

amfphp 与 Flex 通讯的两种方式(转)

发布时间:2020-12-15 01:35:57 所属栏目:百科 来源:网络整理
导读:amfphp是由adobe公司开发的一个开源的项目,用于php与flex通讯的工具类。 ? ?????? amfphp的使用比较简单,只要在官网下载后,解压即可使用,具体的使用方法就不在这里赘述了,要了解 的朋友可以上官网或是下载视频了解(个人推荐 "郑岩峰"关于flex的视频,讲

amfphp是由adobe公司开发的一个开源的项目,用于php与flex通讯的工具类。

?

?????? amfphp的使用比较简单,只要在官网下载后,解压即可使用,具体的使用方法就不在这里赘述了,要了解

的朋友可以上官网或是下载视频了解(个人推荐 "郑岩峰"关于flex的视频,讲解的比较细).

?

?

这里主要是要讲一下amfphp与php的通讯的两种方法:

1. NetConnection + Responder

2. Remoting Object

?

?

一、NetConnection + Responder 的连接方式

?

1.先定义一个NetConnection变量

2.连接NetConnection

3.调用连接的call方法,以调用服务器上的类及方法。方法是:conn.call("服务器的类.类中的方法",new Responder(处理成功的方法,处理失败的方法,参数1,参数2,...));

?

如下:

private var conn:NetConnection =? new NetConnection();

?

conn.connect("http://localhost/amfphp/gateway.php");

?

conn.call("HelloWorld.sayHello",new Responder(success,fault),var1,var2....);

?

然后定义成功与失败的方法

?

public funciton success(result:Object):void {

????? //TODo?? //这里的result由于是一个对象,所以可以转换为任意格式,不过也要根据远程服务传回的内容相对应

?

?

}

?

public function fault(result:Object):void {

???? //TODO

}

?

第一种方法就是那么简单。

?

?

二、远程对象 Remoting Object

?

用这个Remoting Object 就比较复杂一些了,不过确是推荐的方法,因为php自4.0以来就支持面向对象的编程了,所以

用远程对象的方法会使传输的数据内容更加丰富,对以后的维护也更加的方便 。

?

1. 先写一个service-config.xml 文件,如果不会写这个文件,在browse下有相应的例子,如下:

?

service-config.xml

?

<?xml version="1.0" encoding="UTF-8"?>
<services-config>
??? <services>
??????? <service id="sabreamf-flashremoting-service"
???????????????? class="flex.messaging.services.RemotingService"
???????????????? messageTypes="flex.messaging.messages.RemotingMessage">
??????????? <destination id="amfphp">
??????????????? <channels>
??????????????????? <channel ref="my-amfphp"/>
??????????????? </channels>
??????????????? <properties>
??????????????????? <source>*</source>
??????????????? </properties>
??????????? </destination>
??????? </service>
??? </services>

??? <channels>
??????? <channel-definition id="my-amfphp" class="mx.messaging.channels.AMFChannel">
??????????? <endpoint uri="http://flashservices/gateway.php" class="flex.messaging.endpoints.AMFEndpoint"/>
??????? </channel-definition>
??? </channels>
</services-config>

?

?

这里最主要是的定义channel,由于一般来说,都是使用一个gateway.php的,所以一般定义一个channel就行了,当然了,如果有多个服务器的话,可以写多个channel。

?

这个文件主要要修改的地方就是那个 endpoint 下的 uri 地址,其他的基本不用改变。

?

这里我们要将这个uri 定义成我们服务器中使用的gateway的地址

http://localhost/amfphp/gateway.php

?

这样service-config.xml 就写好了。

要将这个文件放置在调用远程服务的mxml同一个目录下。

?

?

2. 定义我们的mxml 文件

?

在mxml中定义一个RemoteObject如下:

?

<mx:RemoteObject id="service" fault="onFault(event)" source="HelloWorld" destination="amfphp">
??? ??? <mx:method name="sayHello"? result="onResult(event)"/>
??? </mx:RemoteObject>

?

在这里定义一个RemoteObject 定义id 为service,一会使用服务的时候,就要用到这个id.

?

fault 是指当失败时,要调用什么方法,这里的方法要传入一个事件。

source 是指远程的服务的类名

destination 是指我们在 service-config.xml 中定义的关于channel的destination

?

然后在RemoteObject 中定义方法

name 是指远程服务的类下的方法,像我们这里定义 的是HelloWorld 类,这个类下有一个叫sayHello的方法.

result 是指当成功时,要调用哪个方法,这个方法也要传入一个事件

?

如果这个类下有多个方法时,我们可以将所有的方法都写在这里面。

?

?

然后要我们就可以定义一个按钮去触发这个连接了,如下:

?

<mx:TextArea id="amfphptest"? width="200" height="107"/>?

<mx:Button label="call amfphp" click="service.getOperation('sayHello').send(amfphptest.text)" />

?

在这里我们定义了一个文本框 ,用于传入参数及显示服务器中返回的结果。

?

在Button中,当click时,调用我们定义的 RemoteObject的id 即 service

?

service.getOperation('sayHello').send(amfphptest.text)?

?

是指调用 RemoteObject 中的sayHello方法,send是指传送参数,如果有多个参数则用逗号分隔

?

如果RemoteObject中有多个方法时,可以再定义几个按扭以触发这些方法。

?

下面是成功与失败的方法:

?

private function onResult (evt:ResultEvent):void {

??????? amfphptest.text = evt.result.toString();

}

?

private funciton onFault(evt:FaultEvent):void {

??????? amfphptest.text = evt.result.toString();

}

?

可以看来事件的result方法是返回的内容。

?

至些mxml 的内容就是那么多。

?

这里必须要特别注意的一点,必须要确保以下两个步骤正确才能正常运行这个实例

(1). Flex的项目的 Flex Build Path 即是 库中必须引进一个 rpc.swc 包

(2). 在 Flex 项目属性的 Flex Compiler 即是编译选项中的 Additional compiler argments 中加入

????? -locale en_US -service "service-config.xml"?,即是将我们的destination加入到编译中去。

?

?

上面的实例中,只是返回了字符串,但是我们用的是Remoting Object 即是远程对象,这明显不能

证明Remoting Object的功能的强大,下面我们就定义对象来传递内容的例子做一个说明:

?

?

3. RemotingObject 复杂一点的例子

?

?? (1) 先我们要定义一个as 类

?

?? package bean {

?

?

???????? [RemoteClass(alias="bean.Person")]

???????? [Bindable]

???????? public class Person {

?

??????????????? public var firstName:String;

??????????????? public var lastName:String;

??????????????? public var phone:String;

??????????????? public var email:String;

?

???????? }

?

?

?}

?

?

?? 这里定义了一个类,就是一个实例类,定义为可绑定

?

?? 同时,指定别名,即是远程服务器中的service下也有一个bean文件夹,下面也有一个Person类,

?? 即是表示当前类与服务器中的哪一个类相对应。

?

?

?

?

? (2)创建一个服务端的Person类,我们要在service下的 bean下创建

?

?

??? class Person {

???????? var firstName:String;

???????? var lastName:String;

???????? var phone:String;

???????? var email:String;

?

???????? //explicit actionscript package

???????? var $_explicitType = "bean.Person";

?

?? }

?

??? 这里定义的php的Person 类

??? 可以看到这里除了正常的属性外,还有一个叫$_explicitType属性,

??? 这里就是指定该类与Flex中的哪个类相对应

?

??? 上面两步说明了一点,就是要将两个类进行挂钩。

?

??? 这样,就将两个对象对应起来了,所以就可以将这两个对象进行互传,到时将会由amfphp对其进行自动转换。

?

?

??? (3)定义一个 提供服务的类 PersonService,将其与Person放在同一个目录下

?

?

Php代码
<?php ?
include("Person.php"); ?
??
class PersonService { ?
?? ? ??
?? ? ? /**?
?? ? ? * get a list of perple?
?? ? ? * @return an array of person?
?? ? ? */ ?
?? ? ?function getList() { ?
?? ? ? ? ?$person = array ( ?
?? ? ? ? ? ? ? ? array("Huang","wenzhou","13512312","123@qq.com"); ?
?? ? ? ? ? ? ? ? array("Yang","Yi","2342234","1233@qq.com"); ?
?? ? ? ? ?) ?
?? ? ? ? ??
?? ? ? ? ?$p = array(); ?
?? ? ? ? ? ?
?? ? ? ? ? for($a=0;$a<count($person);$a++) { ?
?? ? ? ? ? ? ? ??
?? ? ? ? ? ? ? ? ? $person = new Person(); ?
?? ? ? ? ? ? ? ? ? $person->firstName = $person[$a][0]; ?
?? ? ? ? ? ? ? ? ? $person->lastName = $person[$a][1]; ?
?? ? ? ? ? ? ? ? ? $person->phone = $person[$a][2]; ?
?? ? ? ? ? ? ? ? ? $person->email = $person[$a][3]; ?
??
?? ? ? ? ? ? ? ? ? ?$p[]=$person; ?
?? ? ? ? ?} ?
?? ? ? ? ??
?? ? ? ? ? return $p; ?
??
?? ? } ?
??
???
} ?
?> ?
??
??
(4) 定义我们的 mxml 文件 ??
??
?? ?定义RemoteObject ?
?? ? ?
?? ?如下 ?
?? ?<mx:RemoteObject id="myservice" source="bean.PersonService" ??
?? ? ? ? ? ?destination="amfphp" fault="faultHandler(event)" showBusyCursor="true"> ?
?? ? ? ?<mx:method name="getList" result="getListHandler(event)" fault="faultHandler(event)" /> ?
?? ?</mx:RemoteObject> ?
??
?? ? 可以看到这里有些许的不同了: ?
?? ? source = bean.PersonService ? 即是我们的服务层是在bean下的PersonService ?
?? ? destination = amfphp 还是我们之前定义的destination ?
?? ? showBusyCursor = true 是指当我们调用服务时,页面上是否显示正忙的提示。 ?
?? ? ? ?
?? ? 方法与前面的也差不多。 ?
??
?? ? ?
?? ?定义显示数据的DataGrid ?
??
?? <mx:DataGrid x="10" y="10" width="345" id="people_list" dataProvider="{dp}" change="changeHandler(event)"> ?
?? ? ? ?<mx:columns> ?
?? ? ? ? ? ?<mx:DataGridColumn headerText="Last name" dataField="lastName"/> ?
?? ? ? ? ? ?<mx:DataGridColumn headerText="First name" dataField="firstName"/> ?
?? ? ? ? ? ?<mx:DataGridColumn headerText="Telephone" dataField="phone"/> ?
?? ? ? ? ? ?<mx:DataGridColumn headerText="Email" dataField="email"/> ?
?? ? ? ?</mx:columns> ?
?? ?</mx:DataGrid> ?
??
?? 这里要先定义一个 dp,是一个ArrayCollection,这里是要放即一个个的Person ?
?? ?由于之前我们已经将Person.as 与 Person.php 两个对象已经挂钩了,所以这里amfphp会自动将其进行转换。 ?
??
?? 这里的DataGrid 会有一个change事件, 当用户点击时,将选中的结果显示出来。 ?
??
?? ??
?? 这里最后我们看一下我们的成功及失败的方法如何定义。 ?
??
?? ??
??
?? private function getListHandler(evt:ResultEvent):void { ?
?? ? ?
?? ? ? ? ?dp = new ArrayCollection(ArrayUtil.toArray(evt.result)); ? ? ? ?
??
?? } ?
??
??
?? 我们再定义我们的 button ??
??
?? <mx:Button x="290" y="357" label="get list" click="myservice.getOperation('getList').send();"/> ?
??
??
?? ?复杂的RemoteObject 就完成了。 ?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读