InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

用Flex Builder构建即时聊天应用

作者 张凯峰 发布于 2009年9月1日

领域
语言 & 开发,
企业架构
主题
富客户端/桌面 ,
Java ,
平台 ,
RIA
标签
Adobe ,
Flex

Activa Live Chat是一个基于Adobe Flex的即时在线聊天应用,它可以让网站的所有者通过即时的基于文本的聊天来轻松地为访问者和客户提供实时在线的支持。它为网站的访问者和聊天人提供了基于Flex的UI风格,而在后端的聊天服务则是由PHP实现。

本文会讲解如何使用Adobe Flex和Adobe Blaze DS来构建这样一个聊天应用程序。

Flex 通过开源的BlazeDS消息服务来支持订阅及发布消息。这个消息服务管理着一些Flex客户端可以订阅或发布的目标地址。Flex提供了 Producer和Consumer这两个组件,让你用来向目标地址发送或订阅消息。如果要订阅消息,你就使用Consumer类的 subscribe()方法。当有消息发送到你订阅了的目标地址时,Consumer上就会触发message事件。

使用BlazeDS的发布/订阅功能是很简单的。下面是一个简单的聊天应用的例子:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"                        
        creationComplete="consumer.subscribe()">
        <mx:Script>
            <![CDATA[  
                import mx.messaging.messages.AsyncMessage;  
                import mx.messaging.messages.IMessage;  
                private function send():void  
                {
                    var message:IMessage = new AsyncMessage();  
                    message.body.chatMessage = msg.text; 
                    producer.send(message);  
                    msg.text = "";  
                }
                private function messageHandler(message:IMessage):void  
                {
                    log.text += message.body.chatMessage + "\n";
                }
            ]]>
        </mx:Script>  
        <mx:Producer id="producer" destination="chat"/>
        <mx:Consumer id="consumer" destination="chat"     
            message="messageHandler(event.message)"/> 
        <mx:Panel title="Chat" width="100%" height="100%"> 
            <mx:TextArea id="log" width="100%" height="100%"/> 
            <mx:ControlBar>
                <mx:TextInput id="msg" width="100%" enter="send()"/>
                <mx:Button label="Send" click="send()"/>
            </mx:ControlBar> 
        </mx:Panel> 
    </mx:Application>

消息传递的目的地址是在你的Flex应用根下一个叫messaging-config.xml中配置的。一个目的地址配置的关键元素是在客户端和服务器交换数据的通道。使用BlazeDS,消息传递的目的地址通常使用流通道或者轮询通道。

  • 使用流通道,服务器响应会一直保持开放状态,直到通道连接关闭,这样可以让服务器持续向客户端发送变化的数据。HTTP连接并不是双向的。这意味着一个流 AMF或者HTTP通道实际上需要两个浏览器HTTP连接来完成两个方向上的数据发送。一个用于从服务器向客户端发送流响应,另外一个暂态的连接用在当有 数据需要发送到服务器时,从浏览器池中拖拽数据。这个暂态的连接会立即释放回浏览器的连接池中。
  • 如果数据没有立刻准备好(长轮询),就可以通过一个简单的时间间隔或者服务器等待时间来配置轮询通道。无论哪种方式,轮询响应都会完成请求。浏览器 HTTP1.1连接缺省是持久的,因此浏览器有可能会重复利用已有的HTTP连接来发送接下来的轮询请求,这样就能减少轮询带来的网络负载。

请参考Flex开发者中心来获取更多关于Adobe Flex的入门及深度文章。

张凯峰 InfoQ中文站编辑,有多年软件开发和测试经验,热衷参与技术社区与技术传播。

BlazeDS是很猥琐的技术 发表人 White Skull 发表于
Re: BlazeDS是很猥琐的技术 发表人 loki tang 发表于
顺便再说一声AMF 发表人 White Skull 发表于
AS3是不错的,但是mx包里的一切我都绝对不用…… 发表人 White Skull 发表于
Re: AS3是不错的,但是mx包里的一切我都绝对不用…… 发表人 withyou gakaki 发表于
Re: AS3是不错的,但是mx包里的一切我都绝对不用…… 发表人 cp true 发表于
关于长轮询,有篇文章。 发表人 jiang rosen 发表于
  1. 返回顶部

    BlazeDS是很猥琐的技术

    发表人 White Skull

    这个BlazeDS实现主动推送数据到客户端的方法有两种:
    1.客户端在需要的时候向服务器发送HTTP请求,这跟普通的WEB程序没两样,额外的再保持一个不间断的HTTP长效链接用来给客户端主动推消息。
    2.客户端不断的轮询服务器(亏他们做的出来)。
    ---------------------------------
    blazeDS可以说是个阉割了的LCDS。
    我觉得用这玩意做后台还不如用传统HTTP服务,
    要实现后台向客户端推送数据推荐用SOCKET方式,从简单的拿出blazeDS里的AMF编码库(JAVA的)自己开发到开源的RED5、Adobe官方的一堆服务器(搜索图片"adobe ria plateform")……

    第二种方法在带宽极恶劣的中国是一种邪恶的行为。

  2. 返回顶部

    顺便再说一声AMF

    发表人 White Skull

    AMF是个对象传输协议,可以和JAVA直接传数字、字符串、布尔、数组这些简单数据。因为有不错的压缩比(adobe自称的,咱暂且信之)所以推荐使用,而且在AS3里的Socket类里他是默认使用的。如果你喜欢C++做后台又想用现有的C++传输协议,那么可以用Adobe的Alchemy把这个协议编码的C++库翻译成AS3的库实现客户端与服务器端的通信。

  3. 返回顶部

    AS3是不错的,但是mx包里的一切我都绝对不用……

    发表人 White Skull

    UI组件我就用ASWING,FLEX3组件天生设计不好,代码超级多,超级复杂,BUG超多,CPU占用高,虽然它有不错的可视化设计。FLEX4的UI库重来了,但BUG也少不了。现时Adobe有比肩微软的气势,但其实AS3编译器的优化都很踉跄,语言参考还要从中国招募志愿者来翻译,长期关注其产品并在其技术平台进行进行开发就会感觉到Adobe的程序员团队还未培养好。注意,我不是要拆Adobe的台,微软我更讨厌的,JAVAFX的话希望有闲的时间学学看。

  4. 返回顶部

    Re: BlazeDS是很猥琐的技术

    发表人 loki tang

    传说中的long pulling确实有点ws。

  5. 返回顶部

    Re: AS3是不错的,但是mx包里的一切我都绝对不用……

    发表人 withyou gakaki

    不要java的
    要ruby和php平台的

  6. 返回顶部

    Re: AS3是不错的,但是mx包里的一切我都绝对不用……

    发表人 cp true

    我倒是觉得Flex的架构设计还是不错的,像invalidate routine,Remote Object这些设计。但是通过观察源码可以发现代码组织得比较散乱,基本不OO,5000行以上的文件比比皆是,看得人蛋痛。有可能是之前还没有开源的时候为了隐藏减少接口导致的结果。Flex4的源码还没看过,希望有改善。

  7. 返回顶部

    关于长轮询,有篇文章。

    发表人 jiang rosen

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。