Flex与Netty实现的WEB版IM(即时聊天)

Apache Flex是基于MXML和ActionScript的Flash程序设计框架,可以快速开发RIA(富Internet应用)程序,Netty是JAVA实现的高性能的网络通信框架,可以快速构建网络应用的服务端。即时通讯现在已经非常普遍了,本文以简单的WEB版聊天为例浅谈IM系统的设计与原理,最后再探讨下大规模集群下的服务端的瓶颈与解决思路。

1、可用的方案选型

(1)socket
    基于浏览器的Flash插件的Socket/XMLSocket,可以采用Flex实现
(2)websocket
    HTML5的websocket是非常新的技术,但需要浏览器的支持,面临的问题是老版本的浏览器不可用。
(3)HTTP
    基于AJAX的长轮询和基于HTTP流,开源的有Comet架构的Pushlet
(4)JavaFX与Java Applet

本文采用的是方案1,用Flex编写客户端应用,目前我还没有研究如何将Flash与JS的混合,而是完全采用的Flex技术。
关于Flex的学习,我推荐到Apache上去找,也可以通过阅读《Flex实战》学习,我目前还对Flex了解很少,只能进行简单的编程,编写Flex程序前我只看了两天相关的资料,而且只用到了Socket(Flex中的一个知识点),主要还是ActionScript的学习,ActionScript与JavaScript很类似,能看懂JS的应该也能看懂AS,这里不过多描述。

2、通讯协议设计
在即时通讯中使用的协议很多,熟知的有Jabbe/XMPP/SIP等,还有很多私有的自定义协议。协议是双方协定的数据交互规则,具体采用什么样的协议要根据场景和需求,我为了实现通讯功能,简单地设计了一个规则,具体如下:

我的使用场景包括用户的登录、注销、获取通讯录和发送消息,对于应用场景复杂的应该要考虑更多的情况,根据我在工作中的经验,通讯协议不是一下就设计好的,而是在开发过程进行不断修改与完善,可以说没有协议的设计只能遵循具体的原则,没有最终版。
我在工作中原本是基于XMPP开发的,由于做的是移动互联的应用,受限于移动网络的网速,而XMPP的协议过于庞大,对用户的流量需求太高,为此我开始寻找XMPP的替代品,我最开始选的方案是Google的ProtoBuf,类似的还有Apache的Thrift,这两者都是二进制级别的编码,虽然两者的压缩程度和性能都非常好,但在通讯协议方面不太适合,因为编码后没有可读性,出了问题不好定位。后来我在工作选了JSON来设计,相比XML来说拓展性与性能都要好很多。

3、客户端程序设计
客户端采用的是Flex,使用的集成开发工具是IntelliJ IDEA,基于Apache Flex SDK
根据通讯协议的设计进行客户端的开发,具体代码如下:
<?xml version="1.0"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark">
    <fx:Script><![CDATA[
        import mx.controls.Alert;

        var socket:Socket = null;

        // 初始化连接
        public function conn():void
        {
            socket = new Socket();
            // 增加事件监听处理
            socket.addEventListener(Event.CLOSE,closeHandler);
            socket.addEventListener(Event.CONNECT,connectHandler);
            socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
            // 建立连接
            socket.connect('127.0.0.1',8888);
        }

        // 监听关闭事件
        private function closeHandler(event:Event):void
        {
            trace("closeHandler: " + event);
            Alert.show('closed!');
        }

        // 监听连接成功事件
        private function connectHandler(event:Event):void
        {
            trace("connectHandler: " + event);
            // 注册用户
            setName();
            Alert.show('connected!');
        }

        // 处理接收消息
        private function socketDataHandler(event:ProgressEvent):void
        {
            var str:String = socket.readUTFBytes(socket.bytesAvailable);
            trace("receive data : " + str);
            // 沙箱处理
            if(str.indexOf("<?xml version=\"1.0\"?>") == 0){
      
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值