基于Flash的即时通讯开发思路


基于Flash的即时通讯开发思路
2011年04月25日
  开发即时通讯系统不再是什么难事了,除了用常规的开发语言来开发,现在可以用Flash来开发了,这说明一个问题,要实现一套IM,完完全全可以通过Web来实现,因为Flash无所不能。飞鸽传书来说一下具体的细节问题,虽然文章是转载的,但是确实很不错,文章哪里来就不要管了,对你有用才最重要。
  07年的时候,我所在的公司有一个(在业内游戏开发方面有些名气的)Flash程序员应公司要求,利用FMS开发了一套在线视频导购系统,当时我觉得很牛叉,用户不用安装任何插件,也不用安装什么聊天软件,就可以直接跟销售员在线交流,遇到对产品不清楚的地方,直接让销售员通过摄像头演示一下产品的用法,沟通ok后,就直接确定购买。
  当时我完全不懂Flash,而且微软的silverlight也推出了,我一直希望MS能推出更牛叉更容易的解决方案,让我不用学习新语言也能做出这样类似的应用(当时SL还不支持摄像头),但是一直等啊等(等到花儿也谢了),SL到4.0才支持摄像头,但却没有推出服务端的解决方案,所以目前在这方面貌似仍然是Adobe领先。
  后来换了一家公司也有同类应用(是用As2.0开发的),正好去年底Flash开发人员有事离开了公司,于是在没人接手的情况下,我被迫开始学习As3.0和FMS,因为As3.0与As2.0几乎完全不兼容(以前的AS2.0代码基本上全看不懂),于是我尝试用As3.0把这套系统重新写了一遍。
  下面是基本结构图,其实说穿了这玩意儿也极其简单。
  开发Flash即时通讯系统大致原理: 
  需要做二个Flash:一个用于“视频导购员”,即下图中的ChatServer.swf(以下称为服务端),另一个是给“普通访客”用的,即下图中的ChatClient.swf(以下称为客户端)
  二个Flash运行时,都先连接到FMS服务器,同时"服务端Flash"将用户名等认证信息传输到FMS服务器,FMS服务器再通过ASPX去请求数据库查询,以验证"导购(客服)员"的信息是否有效,验证通过后FMS服务器允许连接,此时导购员可将自己的的视频与音频向所有连接到自己的访客广播。
  访客可以发送文字信息给导购员,导购员可以通过语音或文字回复。
  注:之所以不让访客也能使用摄像头或耳麦,是为了防止有些BT客户播放一些恶作剧的声音或者做一些不雅的动作干扰导购员。同时这样也节省了带宽,否则的话,就变成一个单纯的视频多人聊天室了 (再演化下去就变成前些年曾盛极一时的~裸~聊@系$统了,呵呵,当然我们都是走正道的人,这种事儿咱不干,所以我把这个用于电子商务购物平台上的在线视频导购)
  这是运行中的基本界面(尚未美化,难看了一点):
  这类Flash即时通讯系统的基本功能: 
  01.服务端(Flash)能推送摄像头视频和麦克风音频到客户端(Flash).
  02.服务端能显示访客列表,并能从列表中选择需要交谈的对象,实现一对一的视频/语音广播(当然技术上也可以让所有客户听到导购员的声音,这样显得更真实,会让导航员看上去确实比较忙,能造点气氛,呵呵)
  03.服务端能同时接受所有访客的文字消息及系统消息.
  04.服务端对指定访客要有屏蔽(黑名单)功能(防止恶意骚扰)
  05.服务端允许设置快速回复,以提高工作效率。
  06.服务端允许暂停视频/音频直播,方便偶尔离开的情况,休息回来后,可继续直播。
  06.客户端能调节音频的音量大小.
  07.客户端能在线直接截取视频图象并保存.
  08.客户端能随时发送文字消息给服务端(前提是未被列为黑名单的情况下)
  09.客户端能显示所有在线的导购员列表,并能切换选择不同的导购员视频/音频。
  10.客户端能随时接收系统广播。
  另外,对了方便运营商管理和监控,以避免发生一些不良现象(比如个人素质不好的导购员,可能会做出一些不雅的动作或姿态),还需要另做一个管理端Flash,用于实时监控所有在列的导购员视频(就象小区门卫的监控窗口一样),如果发现不良行为,可以强制让导购员下线。
  如果需要保存文字聊天记录或记录导购员及访客的登录时间,也可以在FMS服务器上保存每一条详细记录。
  Flash即时通讯系统主要技术要点: 
  1.FMS开发中,Application目录下每一个文件夹即为一个应用,所以最简单的解决办法:有多少个导购员,就建多少个文件夹。
  2.多个访客连接某一位导购员,其实就是让这些访客与导购员都连接到FMS的某一个文件夹(应用),只不过main.asc中根据不同的身份做出不同的反馈;访客切换不同的导购员,相当于重新连接新的Application.
  3.服务端文本聊天记录的保存,其实只要把每次发送的文字消息trace一下,就会自动记录在FMS的log记录中。
  4.导购在线时间的统计,其实也是在main.asc的onConnect、disConnect事件中可以处理。
  5.管理端对所有导购员的监控,其实就是在一个Flash中同时创建N个connection,每个conn连接到对应的导购员应用(文件夹)。
  6.黑名单或强制下线功能,其实就是在fms服务端disconnect相应的client连接.
  7.FMS与数据库的交互可以通过asp.net来完成,鉴于as对xml的支持程度极为友好,我个人倾向于让fms去加载一个RESTful的wcf来获取数据(wcf返回xml格式),需要保存数据时,也可以让fms把数据post或get到某一个RESTful风格的wcf即可.
  Flash即时通讯系统可能存在的问题: 
  在某些情况下,管理层可能需要对导购员在线的时间做统计,把这个做为考核绩效的一项指标。这样就存在一个问题,导购员可以一直把摄像头开着,然后人跑掉了(或者在线看电影而不是在工作),但系统仍然在不停的计时。
  为了解决这个bug,可以在服务端Flash中利用Camera的onActivity事件做一些处理,每当摄像头有活动时,该事件会被触发,如果长时间画面未动,多半就是人跑掉了,可以向FMS服务器自动发送指令,停止计时。如果要做得更精确,Flash社区里有一些很NB的大牛们,创造了视频像素追踪技术,可以检测某个小范围内的像素(BitmapData)变化情况,感兴趣的朋友可以百度,google.
  Flash即时通讯系统性能及扩展问题: 
  windows系统下,如果某个目录下的子文件夹数量过多(比如1w个),将会严重影响IO性能(最典型的表现就是进入该目录时,系统响应极慢),也就是说如果导购员很多,就得分到不同的服务器,这个其实很好解决,多架设几台服务器分散即可,比如1-100个导购员,放在1号服务器,101-200个导购员放在2号服务器...,当然如果您的money足够多,业内有很多专业做cdn加速和负载均衡的公司,可以实现集群/CDN的的解决方案(不过那花费可就hign了去了)。
  另外,Adobe官方也有相应的集群解决方案:http://files。cnblogs。com/yjmyzz/Flash%2bMedia%2bServer%2b3%e6%8a%80%e6% 9c%af%e6%8c%87%e5%8d%97.pdf 这是“Flash+Media+Server+3技术指南”,里面有一部分提到了集群部署问题,感兴趣的朋友可以下回去研究。
  相关基础技术可参见下面的文章: 
  Flash/Flex学习笔记(10):FMS 3.5之Hello World! 
  Flash/Flex学习笔记(12):FMS 3.5之如何做视频实时直播 
  Flash/Flex学习笔记(53):利用FMS快速创建一个文本聊天室 
  另外FMS3.5安装以后的文档也是极好的参考资料.
  后记: 
  在评论中看到有部分朋友对于这种架构的开发成本(主要是FMS产品的费用)有所担心,其实我很奇怪:大家都在用D版的windows Xp/win7,D版的Office,D版的vs.net,D版的TFS,甚至D版的SqlServer... 好象很少有人担心微软上门来收费,为何就一个FMS,就担心成这样?
  好吧,我承认FMS是收费软件,这确实不能算是这种架构的优势,但其实Adobe是很开放的(不象某水果公司讲的那样),很多标准和协议都是公开的,所以开源界根据这些标准也有人推出了FMS的替换产品RED5,以下是百度知道上摘抄过来的:
  Red5的主要功能和Macromedia公司的FMS类似,提供基于Flash的流媒体服务的一款基于Java的开源流媒体服务器。它由Java语言编写,使用RTMP作为流媒体传输协议,这与FMS完全兼容。它具有流化FLV、MP3文件,实时录制客户端流为FLV文件,共享对象,实时视频播放、Remoting等功能。用Red5替换FMS后,客户端不用更改可正常运行。
  注意高亮部分,也就是说,如果你拿fms的免费版本做开发,技术成熟以后,如果出于成本考虑,换成red5,Flash端是不用做任何修改的,仅服务端可能需要重新做些调整即可。
  另外关于开发工具的选择,其实Flash有很多第三方的开发工具,都不要钱的,并非只有Flash CS与Flex Builder/Flash Builder可选。
  Flash不仅仅只是一个嵌在网页中的小动画,其实...它也是一个很舞台很大的平台。

猜你喜欢

转载自zskc07zskc.iteye.com/blog/1571874