+ -
当前位置:首页 → 问答吧 → Flash AMF3与php数据交互

Flash AMF3与php数据交互

时间:2010-11-27

来源:互联网

之前看了黄盈樟同学发表关于amfphp的文章,觉得很有意思,拿来看了一下,里面的例子比较简单,主要是用flash端以rpc方式读取了服务端的一些类方法,然后返回flash端,并没有什么数据交互,因此尝试修改了一下,看能不能直接把flash的变量、数组之类的数据直接post上服务端。这段过程比较痛苦,感谢flash组的各位同事的配合。

用as3写的程序貌似发送格式是默认amf3的,但尝试改了一下amf0,数据是一样的- -!这个我比较外行,略带一下就算了,转入正题。首先创建一下连接,用flash做个提交表单就行了,什么连接都一样的。。。只要服务端读取裸数据就行。一开始打算直接post 一个flash对象(var obj = {myName:"xiao",score:100})看看会有什么结果(比较天真),当然在服务端也不会给你什么惊喜,直接输出[Object object],连二进制数据都懒得显示...后来改进了一下,先把对象序列化一下,再post上去,php输出一些类似于'myName   xiao scored'的数据,看到点希望了,有数据格式证明可以拿来翻译,但是之后的改动又让我十分苦恼,把对象改成 var obj = {myName:"xiao",score:100.01} 时,序列化post上去,得出的结果竟是'score@Y',就直接结束了,上网找了很久的资料,并没有相关的解释,如果不能提交float、double型的,那就没了很多乐趣了,开始以为是php在底层把二进制数据翻译成字符串的时候截掉了,因此把提交上来的数据换成十六进制输出一下,看能不能看懂(为啥不用十进制?直接改十进制变成0。。。),得出的结果是一样的。然后google了很久,网上多数都是amf3跟java交互,php的甚少,还有一些是mxml,看不懂,就没管它了。后来听说有个叫byteArray的,可以用来存放字符串、数组、对象,然后做二进制处理(好像是这样吧),像是一种数据的打包。迫不及待把obj塞进byteArray里面,

var bytes:ByteArray = new ByteArray();

bytes.writeObject(obj);

然后把bytes发送出去,在php端显示的结果还是一样,难道其中有什么奥妙??

当中也试过把bytes compress一下再发,得出的结果是一样的,原来它是把数据gzip了,对结果的影响不大。

最后尝试把各个变量逐一压进bytes里面,

var arr:Array = [1,2,3];
var arr1:Array = [2,3,4];
var arr2:Array = [4,5,6];

str = "good!";

var bytes:ByteArray = new ByteArray();
bytes.writeMultiByte(str, 'utf8');
bytes.writeObject(arr);
bytes.writeObject(arr1);
bytes.writeObject(arr2);
bytes.writeFloat(1.1);

然后再把bytes发送上来,终于得出了想要的序列化效果,原来要逐个跟bytes说这是一个什么类型的变量,它才能完美地序列化,看来对包含多类型数据的对象不是很支持,稍后附上php端的解释程序。

作者: 我不是鱼   发布时间: 2010-11-27