青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

使用ActionScript開發Ice Web客戶端

我們目前的項目服務器端使用了Ice來構建。Ice有一套自己的網絡協議,客戶端和服務器端可以基于此協議來交互。由于Ice使用Slice這種中間語言來描述服務器和客戶端的交互接口,所以它可以做到極大限度地屏蔽網絡協議這個細節。也就是說,我們只要借助Ice和Slice,我們可以輕松地編寫網絡程序。

然后,我們的后端現在需要一個運行在Web瀏覽器上的客戶端。要與Ice做交互,如果使用TCP協議的話,得保證是長連接的。但HTTP是短連接的。而另一方面,我們還需要選擇一個Ice支持的和Web相關的語言來做這件事情。如果要在瀏覽器端直接與Ice服務建立連接,可供選擇的語言/平臺包括:

  • Flash
  • Silverlight

因為我之前用erlang簡單寫了個Ice的客戶端庫,所以我對Ice底層協議有一定了解,可以不一定使用Ice支持的語言,所以HTML5其實也是個選擇。此外,如果在瀏覽器端使用Applet,Java可能也是個選擇。

其實幾個月前在這塊的技術選擇問題上我就做過簡單的研究,當時確定的方案是使用Flash。但是,后來人員招聘上遇到了問題,看起來要招一個會ActionScript和前端頁面技術的程序員來做我們這種項目,似乎大材小用,成本顯高了。

那么,考慮到團隊里有現成的Java程序員,而且看起來招一個會用Java寫網站的程序員簡單又便宜,似乎是排除技術原因的最好選擇。但是,如果不在瀏覽器端直接連接服務器來做交互,而是讓Web服務器端來做中轉的話,會面臨不少問題:

  • 瀏覽器端操作結果的獲取問題,說白了就是非實時了,得用Ajax等等技術去模擬實時,代價就是不斷輪訓,也就是通常說的poll
  • Web服務器端需要編寫大量代碼:對用戶操作的映射,結果緩存等等

如果能用Flash包裝與服務器交互的部分,而把UI相關的東西留給HTML/JS/CSS去做,那是不是可行一點?如果只是用ActionScript編寫與服務器端的交互邏輯代碼,我就不需要花時間去系統學習ActionScript,甚至如何用Flash做界面,我甚至不用搞懂這些技術之間的關系?;旧峡葱㊣ce for ActionScript的例子代碼,就可以完成這件事情。

以下記錄一些主要的過程/方法:

ActionScript程序的開發

開發一個嵌入到網頁中的FLASH,只需要Flex SDK。SDK里自帶了一些編譯器相關工具。我不打算使用IDE,因為看起來IDE更復雜。簡單的google之后,基本就可以構建出一個Flash文件:

  • 構建基本的程序需要一個mxml文件,這個文件里主要用來捕獲Flash在頁面上初始化完成這個事件,以初始化內部邏輯
  • 編寫ActionScript源碼,看起來其文件、類的組織方式很像Java
  • 使用Flex SDK中的mxmlc程序來編譯,生成swf文件,例如:

    mxmlc myflexapp.mxml -library-path+=xxx.swc

  • 嵌入到網頁中,簡單的做法可以借助swfobject.js這個庫,嵌入的方式:

     <script type="text/javascript" src="swfobject.js"></script>
    <script type="text/javascript">
        var flashvars = {};
        var params = {};
      params.play = "true";
        params.quality = "high";
        params.bgcolor = "white";
        params.allowscriptaccess = "always";
        params.allowfullscreen = "true";
        var attributes = {};
        attributes.id = "asclient";
        attributes.name = "asclient";
        attributes.align = "middle";
        swfobject.embedSWF("asclient.swf", "flashContent", "1", "1",
            "0", "", 
            flashvars, params, attributes);
        swfobject.createCSS("#flashContent", "display:none;");
    </script>

自然,頁面中需加入flashContent這個div:

     <div id="flashContent">
        <p>no flash</p>
    </div>

我的mxml文件也很簡單:

<?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/mx"
    applicationComplete="doApplicationComplete()" >
    <fx:Script>
    <![CDATA[
       import ASClient.Coordinator;
       import flash.external.ExternalInterface;

       private var _coordinator:Coordinator;

       public function doApplicationComplete():void
       {
            trace("doApplicationComplete");
            _coordinator = new Coordinator();
            _coordinator.reg_methods();
            ExternalInterface.call("as_ready"); 
       } 
     ]]>
    </fx:Script>
</s:Application>

ActionScript日志

我通過日志來調試ActionScript代碼。最簡單的方式就是通過trace函數來輸出日志。要成功輸出日志包含以下步驟:

  • 給瀏覽器安裝調試版本的Flash Player
  • 日志是輸出到用戶目錄下的,并且需要手動創建日志目錄(Administrator替換為用戶名):

      C:\Users\Administrator\AppData\Roaming\Macromedia\Flash Player\Logs
    
  • 用戶目錄下新建配置文件mm.cfg:

      AS3StaticProfile=0
      AS3Verbose=0
      TraceOutputFileEnable=1 
      TraceOutputBuffered=0
      ErrorReportingEnable=1  
      AS3Trace=0
    
  • 編譯DEBUG版本的Flash文件,可以修改flex sdk下的flex-config.xml文件,里面增加debug=true配置即可

在開發過程中需要注意瀏覽器緩存問題,當編譯出新的Flash文件后,瀏覽器即使頁面刷新也可能使用的是緩存里的Flash。當然,最重要的,是通過瀏覽器來訪問這個包含了Flash的網頁,Web服務器隨意。

Flash Policy文件

在Flash的某個版本后,Flash中如果要向外建立socket連接,是首先要取得目標主機返回的policy文件的。也就是在建立連接前,Flash底層會先向目標主機詢問得到一個描述訪問權限的文件。

簡單來說,目標主機需要在843端口上建立TCP監聽,一旦有網絡連接,就發送以下內容,內容后需添加0x00用于標示結束。(當然,具體細節還挺多,自行google)

<cross-domain-policy>
     <allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>

最開始我使用的是朋友給的現成的Policy服務,雖然我寫的Flash可以成功連接我的Ice服務,但始終要等待2秒以上的時間。google Flash Policy相關內容,可以發現確實存在一個延時,但那是因為目標主機沒有在843端口服務。后來我自己用erlang寫了個Policy服務,延時就沒有了。猜測可能是他的Policy服務沒有添加0x00作為結束導致。

ActionScript與JavaScript的交互

既然我使用ActionScript來包裝與服務器的交互,那么JavaScript就必然需要和ActionScript通信。這個通信過程也就是在JavaScript中調用ActionScript中的函數,反過來亦然。這個過程很簡單:

在JavaScript中調用ActionScript函數:

首先是ActionScript需要注冊哪些函數可以被調用:

ExternalInterface.addCallback("service_loadall", loadAll);

通過ExternalInterface.addCallback注冊的函數,其實是個closure,所以在類中注冊自己的成員函數都可以(因為成員函數會使用this,形成了一個closure)。

然后在JavaScript中調用:

    function asObject() {
        // asclient是嵌入Flash時填入的name和(或?)id
        return window.document.asclient;
    }
    var as = asObject();
    as.service_loadall();

在ActionScript中調用JavaScript中調用則更簡單,一句話:

ExternalInterface.call("service_load_done", args);

至于在兩者之間的函數參數傳遞,其類型都可以自動映射。但因為我的應用里數據較為復雜,我就將數據轉換為JSON格式,在JavaScript這邊操作較為簡單。

頁面切換

這里我們需要的Web前端頁面,更像是一個管理系統,所以頁面切換是很有可能的。問題在于,當出現頁面跳轉時,Flash對象會重新初始化,新的頁面無法使用前一個頁面建立好的網絡連接(或者能?)。為了解決這個問題,服務器當然可以設計一種重登錄機制,方便客戶端以一種特殊的方式進入系統,繞過正常的登錄環節。但是我們使用了Glacier2這個網關,在這個網關上有針對連接的超時管理,這樣反復建立新的連接對資源太浪費了。

綜上,我想只能通過前端去規避這個問題。例如,前端開發人員依然可以分開設計很多頁面,頁面里也可以使用正常的鏈接。我們編寫一些JavaScript代碼,將頁面里的鏈接替換成對應的JavaScript代碼,動態載入新的頁面內容,然后對頁面內的部分內容進行替換,從而盡可能讓頁面設計人員編寫正常的網頁,同時也解決頁面切換問題。

這是個蹩腳的方法,但在我有限的前端知識體系下,似乎也只能這樣干了。

posted on 2013-06-10 21:30 Kevin Lynx 閱讀(2160) 評論(0)  編輯 收藏 引用 所屬分類: web


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品美女91| 欧美日韩免费观看一区二区三区| 久久综合伊人| 久久久久久综合| 久久久久国产精品麻豆ai换脸| 性久久久久久久久久久久| 午夜在线电影亚洲一区| 久久国产一二区| 欧美成人激情视频免费观看| 欧美激情影音先锋| 国产精品99久久99久久久二8 | 亚洲在线观看免费视频| 亚洲午夜一区| 久久久久91| 欧美精品日韩| 国产精品三级久久久久久电影| 国产九区一区在线| 伊人色综合久久天天| 亚洲精品五月天| 午夜精品www| 久久综合精品国产一区二区三区| 欧美不卡视频一区发布| 99re6热在线精品视频播放速度| 在线视频精品| 久久久亚洲综合| 欧美体内she精视频在线观看| 国产亚洲欧美在线| 日韩一级二级三级| 久久久久久久激情视频| 久久综合影视| 亚洲精品一区在线| 性亚洲最疯狂xxxx高清| 欧美成人精品一区| 中文国产成人精品| 欧美本精品男人aⅴ天堂| 国产精品v欧美精品v日韩| 狠狠色丁香久久婷婷综合丁香 | 亚洲少妇一区| 裸体一区二区| 亚洲无限乱码一二三四麻| 久久一区精品| 国产精品伊人日日| 夜夜精品视频| 欧美成人免费在线观看| 亚洲自拍偷拍麻豆| 欧美日韩不卡合集视频| 一区二区在线视频| 欧美在线看片a免费观看| 亚洲精品午夜精品| 巨胸喷奶水www久久久免费动漫| 国产精品亚洲产品| 亚洲欧洲av一区二区| 亚洲精品韩国| 久久国产黑丝| 国产精品一区二区三区四区五区| 亚洲日产国产精品| 另类欧美日韩国产在线| 性欧美在线看片a免费观看| 欧美午夜视频在线观看| 日韩亚洲欧美一区| 亚洲激情网站免费观看| 美女视频网站黄色亚洲| 伊人婷婷欧美激情| 欧美 亚欧 日韩视频在线| 久久国产日韩| 国产在线播精品第三| 久久久国产一区二区| 欧美亚洲一区二区三区| 国产情人综合久久777777| 午夜影院日韩| 先锋影音久久久| 国内精品嫩模av私拍在线观看| 欧美中在线观看| 欧美在线视频二区| 韩日欧美一区二区| 另类春色校园亚洲| 蜜臀a∨国产成人精品| 亚洲欧洲日韩女同| 亚洲精品视频在线播放| 国产精品久久7| 羞羞答答国产精品www一本 | 免费欧美日韩国产三级电影| 亚洲精品黄网在线观看| 亚洲精品一区二区三| 欧美先锋影音| 久久精品视频99| 免费不卡亚洲欧美| 欧美激情视频给我| 欧美另类亚洲| 香蕉免费一区二区三区在线观看| 午夜精品视频在线观看| 一区二区三区在线高清| 亚洲国产精品传媒在线观看| 欧美日韩卡一卡二| 久久国产精品久久久久久| 久久狠狠亚洲综合| 日韩视频免费观看高清在线视频 | 国产在线观看91精品一区| 嫩模写真一区二区三区三州| 欧美激情第三页| 翔田千里一区二区| 蜜桃久久av一区| 午夜久久久久久久久久一区二区| 午夜在线视频一区二区区别| 91久久精品日日躁夜夜躁国产| 久久电影一区| 欧美国产日韩一区二区| 西西裸体人体做爰大胆久久久 | 欧美日韩免费一区二区三区视频| 香蕉久久精品日日躁夜夜躁| 久久亚洲国产成人| 亚洲欧美日韩爽爽影院| 欧美xx69| 久久精品国产清高在天天线| 欧美精品网站| 久热精品视频在线观看一区| 欧美日韩一区二区视频在线| 欧美wwwwww| 国产日韩在线一区| av成人免费在线| 亚洲国产欧美精品| 欧美一级黄色网| 亚洲欧美另类中文字幕| 欧美好吊妞视频| 久久香蕉精品| 国产亚洲a∨片在线观看| 一区二区三区成人精品| 亚洲精品美女| 麻豆成人av| 久久人人爽人人爽| 国产日韩av一区二区| 一区二区电影免费观看| 亚洲免费不卡| 欧美成人久久| 亚洲成人直播| 亚洲国产精品黑人久久久| 久久精品亚洲一区二区三区浴池 | 亚洲国产一区在线| 亚洲电影第三页| 久久久久99| 免费在线观看日韩欧美| 国产日韩欧美二区| 午夜在线一区| 久久久精彩视频| 国产在线一区二区三区四区| 亚洲欧美在线播放| 久久9热精品视频| 亚洲色无码播放| 国产亚洲成人一区| 欧美一区二区三区在线免费观看 | 欧美国产精品日韩| 久久精品一区二区三区中文字幕| 国产欧美亚洲视频| 欧美一级艳片视频免费观看| 欧美与欧洲交xxxx免费观看| 国产亚洲欧美一区二区三区| 久久激情婷婷| 欧美激情精品久久久| 亚洲精品综合在线| 欧美性猛交99久久久久99按摩| 亚洲深夜影院| 久久精品人人爽| 亚洲人体偷拍| 欧美三区在线视频| 欧美一区2区三区4区公司二百| 狂野欧美一区| 亚洲一区二区伦理| 国产亚洲精品高潮| 欧美承认网站| 亚洲一区在线视频| 六月婷婷一区| 在线视频亚洲一区| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲专区免费| 牛牛精品成人免费视频| 日韩午夜在线电影| 国产精品日日摸夜夜添夜夜av| 欧美一区国产在线| 亚洲经典在线看| 欧美一级二级三级蜜桃| 亚洲国产精品尤物yw在线观看| 欧美三级精品| 久久亚洲综合色一区二区三区| 最新国产拍偷乱拍精品| 亚洲成人在线观看视频| 欧美日韩亚洲高清一区二区| 欧美一区二区三区精品电影| 亚洲国产高清一区| 欧美亚洲专区| 亚洲免费大片| 在线观看日韩| 国产精品一区免费在线观看| 欧美成人官网二区| 欧美在线播放视频| 亚洲男人天堂2024| 亚洲最新视频在线| 亚洲久色影视| 亚洲国产一区二区三区高清 | 亚洲亚洲精品在线观看| 亚洲国产天堂久久综合|