`
hereson
  • 浏览: 1427908 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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) 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics