`

flex amf的使用

阅读更多
AMF是Adobe独家开发出来的通信协议,它采用二进制压缩,序列化、反序列化、传输数据,从而为Flash 播放器与Flash Remoting网关通信提供了一种轻量级的、高效能的通信方式。如下图所示:


AMF(Action Message Format)是一种 binary format的资料型态,透过 AMF overHTTP的方式将flash端资料编码后传回server,server端的remotingadaptor接收到资料后则会译码回正确的native对象,交给正确的程序处理。

AMF最大的特色在于可直接将Flash内置对象,例如Object, Array, Date, XML,传回服务器端,并且在服务器端自动进行解析成适当的对象,这就减轻了开发人员繁复工作,同时也更省了开发时间。由于AMF采用二进制编码,这种方式可以高度压缩数据,因此非常适合用来传递大量的资料。数据量越大,Flash Remoting的传输效能就越高,远远超过Web Service。至于XML, LoadVars和loadVariables() ,它们使用纯文本的传输方式,效能就更不能与Flash Remoting相提并论了。

注意:Flash Remoting需要浏览器支持Binary POST,Flash 播放器在Netscape 6.x.环境下运行Flash Remoting会不起作用(Flash Remoting调用没有效果也不返回错误), Netscape 7已经纠正了这个bug 。对于早期Safari和Chimera版的苹果机也有这个问题。


下面是一个flex amf socket连接例子

java服务器代码:
/*  
 * To change this template, choose Tools | Templates  
 * and open the template in the editor.  
 */  
package sockeserver;   
  
import java.io.*;   
import java.net.ServerSocket;   
import java.net.Socket;   
  
  
import flex.messaging.io.*;   
import flex.messaging.io.amf.*;   
import java.util.HashMap;   
import java.util.Map;   
import java.util.zip.DeflaterOutputStream;   
  
/**  
 *  
 * @author  mumuyu99  
 */  
public class socketServer implements Runnable {   
  
    public static void main(String[] args) {   
start();   
  
    }    //****************************************************************//   
    private static boolean isRunning = false;           //服务器运行标志   
    ServerSocket ss = null;                         //socket连接   
    int userIndexNumber;                            //用户索引号   
    int userCount;                                  //房间人数   
    //Iterator it=null;                             //迭代器   
    //*************************消息协议*********************************//   
    private byte type;                                          //消息类型   
    private byte mainCmd;                                       //消息主命令   
    private byte subCmd;                                        //消息子命令   
    private byte[] data;                                        //消息数据   
    private SerializationContext context = new SerializationContext();   
  
    public static void start() {   
        socketServer server = new socketServer();   
  
        // server.heardHeart();   
        new Thread(server).start();   
        System.out.println("服务器打开");   
    }   
  
    public void run() {   
        try {   
            isRunning = true;   
            try {   
                ss = new ServerSocket(9999);   
            } catch (IOException ex) {   
                System.out.println(ex.toString());   
            }   
            Socket socket;   
            while (isRunning) {   
                socket = ss.accept();   
                handleCmd(socket);   
            }   
  
        } catch (IOException ex) {   
            System.out.println(ex.toString());   
        }   
  
  
    }   
  
    private void handleCmd(Socket inComing) {   
        try {   
            DataInputStream dis = new DataInputStream(inComing.getInputStream());   
            DataOutputStream dos = new DataOutputStream(inComing.getOutputStream());   
  
  
  
  
            System.out.println("准备好接收数据!");   
  
            byte[] lang = new byte[dis.available()];   
            dis.read(lang);   
            System.out.println(new String(lang, "utf-8"));   
  
            Amf3Output out = new Amf3Output(context);   
            DeflaterOutputStream stream = new DeflaterOutputStream(dos);   
            out.setOutputStream(stream);   
  
            Map map = new HashMap();   
            String[] arr = "1,2,3,4,5".split(",");   
  
            map.put("datas", arr);   
            map.put("userName", "mumuyu99");   
            map.put("fullName", "最新消息");   
             
  
            out.writeObject(map);   
            stream.finish();   
  
            dos.writeUTF("你好啊");   
  
            dos.flush();   
  
  
  
        } catch (IOException ex) {   
            System.out.println(ex.toString());   
        }   
  
  
    }   
}  



Flex端的代码如下:
<?xml version="1.0" encoding="utf-8"?>   
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768"  
       
       
    >   
       
    <fx:Script>   
    <!--[CDATA[   
           
        import flash.net.Socket;   
        import mx.controls.Alert;   
           
           
           
        private static var socket:Socket;   
           
        private var byteaa:ByteArray;   
        private function connectSocket():void{   
               
               
            socket=new Socket("localhost",9999)   
            //socket.objectEncoding=ObjectEncoding.AMF3;
                   
            var byteArray:ByteArray=new ByteArray();   
               
            var s:String="hello word!"  
                   
                   
                   
            byteArray.writeUTFBytes(s);   
            socket.writeBytes(byteArray,0,byteArray.length);   
            socket.writeMultiByte(s,"UTF-8");   
            socket.flush();   
            byteaa=new ByteArray();   
            socket.addEventListener(ProgressEvent.SOCKET_DATA,loaderHandler);   
            socket.addEventListener(IOErrorEvent.IO_ERROR,errorIO);   
            socket.addEventListener(Event.CONNECT,connectStart);   
               
               
        }   
           
        private function connectStart(event:Event):void{   
            Alert.show("连接成功!");   
        }   
        private function errorIO(event:IOErrorEvent):void{   
            Alert.show("连接不到数据源!");   
        }   
           
        private function loaderHandler(event:ProgressEvent):void {     
  
            //  var intervalId:uint = setTimeout(laoderInit,100);   
            laoderInit();   
        }     
           
           
        private function laoderInit():void{   
               
               
            var start:Number=getTimer();     
               
               
               
            while(socket.bytesAvailable>0){   
                   
                socket.readBytes(byteaa);      
                   
            }   
               
            byteaa.uncompress();   
               
               
               
               
            var obj:Object = byteaa.readObject();   
            Alert.show(obj.fullName);   
               
            var end:Number=getTimer();      
            Alert.show("耗时:" + (end - start) + "毫秒");    
               
        }   
           
           
        protected function button1_clickHandler(event:MouseEvent):void  
        {   
            connectSocket();   
               
        }   
    ]]-->   
    </fx:Script>   
       
    <s:Button x="190" y="370" label="连接" enabled="true"  click="button1_clickHandler(event)"/>   
       
</s:Application> 
  • 大小: 6.7 KB
分享到:
评论

相关推荐

    AMF.rar_FluorineFx_FluorineFx amf_amf__flex_flex amf

    Flex AMF通讯,主要用于初学者配置FluorineFx.net服务端

    AMF抓取flex页面数据

    抓取AMF协议的flex页面,支持模拟登录和页面抓取。

    flex与amf

    flex与java通信

    flex-messaging-core-amf1.7

    flex-messaging-core-amf1.7

    amf-php flex插件

    这是一个flex的lib库,方便开发者迅速开展amf连接操作。

    AMF数据分析器_V22

    功能: 支持AS3的ByteArray序列化对象的AMF格式编码、解码( readObject、writeObject )。 支持AS3的ByteArray的compress、uncompress压缩算法:...为方便想了解AMF格式及封包的坛友分析解码AMF数据资料使用。

    使用 Flex 4.5 访问数据

    使用 ADOBE FLEX 45访问数据 目录 第 1 章: 访问数据服务概述 Flex 与其它数据访问技术的比较 使用 Flash Builder 访问数据服务 数据访问组件 第 2 章: 使用 Flash Builder 构建以数据为中心的应用程序 创建 Flex...

    Flex + Zend AMF + MYSQL + WAMP 新手指南

    NULL 博文链接:https://sjkgxf7191.iteye.com/blog/572828

    开源amf协议解析封装

    amf c# flex服务端协议解析和封装。

    AMF格式文件

    Adobe Flex BlazeDS AMF File Format 熟悉下这个东西后,可以自己实现BlazeDS的前端和后端,至少也能在浏览器里的F12开发环境里搞明白AMF的内容了。

    AMF.NET 文件极小的开源AMF解析库

    AMF开源FluorineFx文件太大 对于只需要序列化和反序列化AMF数据流的朋友,这个库是不错的选择 支持.net 1.1和2.0+

    flex jar包(很全)

    【flex的jar包,项目中的jar包,比较多,但是有些没用,我都放进去了大家自己取舍吧 】 【2010-12-24】提交过一版,此次加入两个官方更新的jar包。 【2011-06-14】更新:flex-messaging.jar和flex-messaging-common....

    AMF移植代码

    移植RMTP 看看效果 amf flex

    《Flex3权威指南》涉及 源代码

    书中详细介绍了Flex 3的相关知识点,具体包括构建、部署和调试RIA,使用功能强大的MXML语言布置应用程序,使用MXML和ActionScript构建自定义的UI组件,使用XML、基于SOAP的Web服务和远程调用协议AMF连接到数据等。...

    java flex jar包

    java flex jar包 包括jar,比较的简洁明了,很容易上手。

    thinkphp_amf

    thinkphp_amf的一个简单demo

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    不过,针对 Java EE 开发的服务器端应用,可以通过集成 BlazeDS,充分利用 AMF 协议并能轻易与 Flex 前端交换数据,这种方式是 Java EE 应用程序集成 Flex 的首选。 BlazeDS 是 Adobe LifeCycle Data Services 的...

    Enterprise Development with Flex

    get solutions for leveraging AMF protocol and synchronizing Flex client data modifications with BlazeDS-based servers; and, determine the actual performance of your application, and get suggestions ...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    不过,针对 Java EE 开发的服务器端应用,可以通过集成 BlazeDS,充分利用 AMF 协议并能轻易与 Flex 前端交换数据,这种方式是 Java EE 应用程序集成 Flex 的首选。 BlazeDS 是 Adobe LifeCycle Data Services 的...

    构建全栈式Flex、BlazeDS和Spring集成解决方案

    JBoss作为应用服务器、MySQL作为数据存储、Hibernate完成数据访问、Spring用来构建业务层、BlazeDS作为远程服务、 Flex用来构建富客户端,使用Maven及flex-compiler-mojo插件进行项目构建,打造全栈式Flex、BlazeDS...

Global site tag (gtag.js) - Google Analytics