天天看點

基于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不僅僅隻是一個嵌在網頁中的小動畫,其實...它也是一個很舞台很大的平台。