Java和flash通信中数据的AMF3封装

Flash加载外部http数据有很多封装方式,常用的数据封装格式有xml SOAP、json、webService和amf等。其中前面三个都是互联网通用的基于字符串的格式,而AMF是Adobe独家开发出来的封装格式,它和其他格式不一样的地方是基于二进制的,而且这种格式是Flash可以读取的。它的优点也显露出来了:1、由于基于二进制,而且没有像xml那样很多的冗余数据,传输同样的数据量体积会小很多。2、数据传输到Flash端可以直接读取,无需进行字符串解释等反序列化过程,效率也提高了。(amf有两种格式:AMF0和AMF3;Flash8之前的版本只支持AMF0,Flash9支持两种格式、不过flash使用AMF3应该效率会高点,因为AMF0是兼容之前版本用的) 
然而amf是Adobe独家开发的,如果不清楚它的数据封装格式就无法用其它后台语言将数据封装成amf再传输到flash那里。然而目前有很多开源的框架支持amf,如php的amfphp、java的openamf等。 
Adobe前段时间发布一个名为“BlazeDS”的开源的Flash数据访问项目,各位可以去adobe官方网站下载研究。它的功能和adobe livecycle data services类似,只是提供开源并且少了rtmp通信方面的功能。 
关于AMF3封装的类就存在BlazeDS的flex.messaging.io.amf包里面,其中几个比较重要的类有(Amf3Output、Amf3Input等,如果想兼容flash8之前版本请使用Amf0Output和Amf0Input)。 
如果各位想用AMF3格式又不想使用Flex的remoting功能,可以手动封装AMF格式。下面简单介绍一下怎样在java中amf的封装: 
Java端代码:(封装一个Object对象,Object保存了name=weni;age=27;web=www.weni.cn 以及一个长度为10000的数组,然后将对象保存到一个文本文件里面) 

SerializationContext serializationContext=new SerializationContext(); 
Amf3Output amfOut = new Amf3Output(serializationContext); 
    ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
    DataOutputStream dataOutStream = new DataOutputStream(outStream); 
    amfOut.setOutputStream(dataOutStream); 
     
    HashMap<String, Object> map=new HashMap<String, Object>(); 
    Double[] arr=new Double[10000]; 
    for(int index=0;index<10000;index++) 
    { 
     arr[index]=Math.random(); 
    } 
    map.put("arr", arr); 
    map.put("name", "weni"); 
    map.put("age", "27"); 
    map.put("web", "www.weni.cn"); 
    try 
    { 
amfOut.writeObject(map); //写入java HashMap对象,会自动转换成Flash的Object对象 
dataOutStream.flush(); 
} catch (IOException e) 

e.printStackTrace(); 


    byte[] messageBytes = outStream.toByteArray(); 
    try  
    {  
      FileOutputStream  os;  
      OutputStreamWriter  ow;  
      BufferedWriter  out;  
      os  =  new  FileOutputStream("D://test.txt");  
      ow  =  new  OutputStreamWriter(os);  
      out  =  new  BufferedWriter(ow);  
      os.write(messageBytes); 
      os.flush(); 
      os.close();  
      System.out.println("OK"); 
}catch(Exception  e)  

System.out.println("error  :"  +  e);                       



客户端读取代码: 
var loader:URLLoader=new URLLoader(); 
loader.load(new URLRequest("D://test5.txt")); 
loader.addEventListener(Event.COMPLETE,onComplete); 
loader.dataFormat=URLLoaderDataFormat.BINARY; 
private function onComplete(evt:Event):void 

var start:Number=getTimer(); 
var byte:ByteArray=loader.data as ByteArray; 
var obj:Object=byte.readObject(); //读取出来的对象 
var end:Number=getTimer(); 
trace("耗时:"+(end-start)+"毫秒") 
trace(obj.name,obj.age,obj.arr.length) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值